Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: pkg/analyzer/test/generated/ast_test.dart

Issue 192303002: Support for @DartName and @DartOptional annotations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // This code was auto-generated, is not intended to be edited, and is subject to 5 // This code was auto-generated, is not intended to be edited, and is subject to
6 // significant change. Please see the README file for more information. 6 // significant change. Please see the README file for more information.
7 7
8 library engine.ast_test; 8 library engine.ast_test;
9 9
10 import 'package:analyzer/src/generated/java_core.dart'; 10 import 'package:analyzer/src/generated/java_core.dart';
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 static ConditionalExpression conditionalExpression(Expression condition, Expre ssion thenExpression, Expression elseExpression) => new ConditionalExpression(co ndition, TokenFactory.tokenFromType(TokenType.QUESTION), thenExpression, TokenFa ctory.tokenFromType(TokenType.COLON), elseExpression); 394 static ConditionalExpression conditionalExpression(Expression condition, Expre ssion thenExpression, Expression elseExpression) => new ConditionalExpression(co ndition, TokenFactory.tokenFromType(TokenType.QUESTION), thenExpression, TokenFa ctory.tokenFromType(TokenType.COLON), elseExpression);
395 395
396 static ConstructorDeclaration constructorDeclaration(Identifier returnType, St ring name, FormalParameterList parameters, List<ConstructorInitializer> initiali zers) => new ConstructorDeclaration(null, null, TokenFactory.tokenFromKeyword(Ke yword.EXTERNAL), null, null, returnType, name == null ? null : TokenFactory.toke nFromType(TokenType.PERIOD), name == null ? null : identifier3(name), parameters , initializers == null || initializers.isEmpty ? null : TokenFactory.tokenFromTy pe(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, emptyFunctionBody()); 396 static ConstructorDeclaration constructorDeclaration(Identifier returnType, St ring name, FormalParameterList parameters, List<ConstructorInitializer> initiali zers) => new ConstructorDeclaration(null, null, TokenFactory.tokenFromKeyword(Ke yword.EXTERNAL), null, null, returnType, name == null ? null : TokenFactory.toke nFromType(TokenType.PERIOD), name == null ? null : identifier3(name), parameters , initializers == null || initializers.isEmpty ? null : TokenFactory.tokenFromTy pe(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, emptyFunctionBody());
397 397
398 static ConstructorDeclaration constructorDeclaration2(Keyword constKeyword, Ke yword factoryKeyword, Identifier returnType, String name, FormalParameterList pa rameters, List<ConstructorInitializer> initializers, FunctionBody body) => new C onstructorDeclaration(null, null, null, constKeyword == null ? null : TokenFacto ry.tokenFromKeyword(constKeyword), factoryKeyword == null ? null : TokenFactory. tokenFromKeyword(factoryKeyword), returnType, name == null ? null : TokenFactory .tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name), param eters, initializers == null || initializers.isEmpty ? null : TokenFactory.tokenF romType(TokenType.PERIOD), initializers == null ? new List<ConstructorInitialize r>() : initializers, null, body); 398 static ConstructorDeclaration constructorDeclaration2(Keyword constKeyword, Ke yword factoryKeyword, Identifier returnType, String name, FormalParameterList pa rameters, List<ConstructorInitializer> initializers, FunctionBody body) => new C onstructorDeclaration(null, null, null, constKeyword == null ? null : TokenFacto ry.tokenFromKeyword(constKeyword), factoryKeyword == null ? null : TokenFactory. tokenFromKeyword(factoryKeyword), returnType, name == null ? null : TokenFactory .tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name), param eters, initializers == null || initializers.isEmpty ? null : TokenFactory.tokenF romType(TokenType.PERIOD), initializers == null ? new List<ConstructorInitialize r>() : initializers, null, body);
399 399
400 static ConstructorFieldInitializer constructorFieldInitializer(bool prefixedWi thThis, String fieldName, Expression expression) => new ConstructorFieldInitiali zer(prefixedWithThis ? TokenFactory.tokenFromKeyword(Keyword.THIS) : null, prefi xedWithThis ? TokenFactory.tokenFromType(TokenType.PERIOD) : null, identifier3(f ieldName), TokenFactory.tokenFromType(TokenType.EQ), expression); 400 static ConstructorFieldInitializer constructorFieldInitializer(bool prefixedWi thThis, String fieldName, Expression expression) => new ConstructorFieldInitiali zer(prefixedWithThis ? TokenFactory.tokenFromKeyword(Keyword.THIS) : null, prefi xedWithThis ? TokenFactory.tokenFromType(TokenType.PERIOD) : null, identifier3(f ieldName), TokenFactory.tokenFromType(TokenType.EQ), expression);
401 401
402 static ConstructorName constructorName(TypeName type, String name) => new Cons tructorName(type, name == null ? null : TokenFactory.tokenFromType(TokenType.PER IOD), name == null ? null : identifier3(name)); 402 static ConstructorName constructorName(TypeName type, String name) => new Cons tructorName(type, name == null ? null : TokenFactory.tokenFromType(TokenType.PER IOD), name == null ? null : identifier3(name));
403 403
404 static ContinueStatement continueStatement() => new ContinueStatement(TokenFac tory.tokenFromKeyword(Keyword.CONTINUE), null, TokenFactory.tokenFromType(TokenT ype.SEMICOLON)); 404 static ContinueStatement continueStatement([String label]) {
405 405 SimpleIdentifier labelNode = label == null ? null : identifier3(label);
406 static ContinueStatement continueStatement2(String label) => new ContinueState ment(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), identifier3(label), TokenF actory.tokenFromType(TokenType.SEMICOLON)); 406 return new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE) , labelNode, TokenFactory.tokenFromType(TokenType.SEMICOLON));
407 }
407 408
408 static DeclaredIdentifier declaredIdentifier(Keyword keyword, String identifie r) => declaredIdentifier2(keyword, null, identifier); 409 static DeclaredIdentifier declaredIdentifier(Keyword keyword, String identifie r) => declaredIdentifier2(keyword, null, identifier);
409 410
410 static DeclaredIdentifier declaredIdentifier2(Keyword keyword, TypeName type, String identifier) => new DeclaredIdentifier(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, identifier3(identifier)); 411 static DeclaredIdentifier declaredIdentifier2(Keyword keyword, TypeName type, String identifier) => new DeclaredIdentifier(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, identifier3(identifier));
411 412
412 static DeclaredIdentifier declaredIdentifier3(String identifier) => declaredId entifier2(null, null, identifier); 413 static DeclaredIdentifier declaredIdentifier3(String identifier) => declaredId entifier2(null, null, identifier);
413 414
414 static DeclaredIdentifier declaredIdentifier4(TypeName type, String identifier ) => declaredIdentifier2(null, type, identifier); 415 static DeclaredIdentifier declaredIdentifier4(TypeName type, String identifier ) => declaredIdentifier2(null, type, identifier);
415 416
416 static DoStatement doStatement(Statement body, Expression condition) => new Do Statement(TokenFactory.tokenFromKeyword(Keyword.DO), body, TokenFactory.tokenFro mKeyword(Keyword.WHILE), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condi tion, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), TokenFactory.tokenFromT ype(TokenType.SEMICOLON)); 417 static DoStatement doStatement(Statement body, Expression condition) => new Do Statement(TokenFactory.tokenFromKeyword(Keyword.DO), body, TokenFactory.tokenFro mKeyword(Keyword.WHILE), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condi tion, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), TokenFactory.tokenFromT ype(TokenType.SEMICOLON));
(...skipping 11 matching lines...) Expand all
428 static ExpressionFunctionBody expressionFunctionBody(Expression expression) => new ExpressionFunctionBody(TokenFactory.tokenFromType(TokenType.FUNCTION), expr ession, TokenFactory.tokenFromType(TokenType.SEMICOLON)); 429 static ExpressionFunctionBody expressionFunctionBody(Expression expression) => new ExpressionFunctionBody(TokenFactory.tokenFromType(TokenType.FUNCTION), expr ession, TokenFactory.tokenFromType(TokenType.SEMICOLON));
429 430
430 static ExpressionStatement expressionStatement(Expression expression) => new E xpressionStatement(expression, TokenFactory.tokenFromType(TokenType.SEMICOLON)); 431 static ExpressionStatement expressionStatement(Expression expression) => new E xpressionStatement(expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
431 432
432 static ExtendsClause extendsClause(TypeName type) => new ExtendsClause(TokenFa ctory.tokenFromKeyword(Keyword.EXTENDS), type); 433 static ExtendsClause extendsClause(TypeName type) => new ExtendsClause(TokenFa ctory.tokenFromKeyword(Keyword.EXTENDS), type);
433 434
434 static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword, TypeN ame type, List<VariableDeclaration> variables) => new FieldDeclaration(null, nul l, isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null, variableDecl arationList(keyword, type, variables), TokenFactory.tokenFromType(TokenType.SEMI COLON)); 435 static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword, TypeN ame type, List<VariableDeclaration> variables) => new FieldDeclaration(null, nul l, isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null, variableDecl arationList(keyword, type, variables), TokenFactory.tokenFromType(TokenType.SEMI COLON));
435 436
436 static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword, List <VariableDeclaration> variables) => fieldDeclaration(isStatic, keyword, null, va riables); 437 static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword, List <VariableDeclaration> variables) => fieldDeclaration(isStatic, keyword, null, va riables);
437 438
438 static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName typ e, String identifier) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeywo rd(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(iden tifier), null); 439 static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName typ e, String identifier, [FormalParameterList parameterList]) => new FieldFormalPar ameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keywor d), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromTyp e(TokenType.PERIOD), identifier3(identifier), parameterList);
439 440
440 static FieldFormalParameter fieldFormalParameter2(Keyword keyword, TypeName ty pe, String identifier, FormalParameterList parameterList) => new FieldFormalPara meter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword ), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType (TokenType.PERIOD), identifier3(identifier), parameterList); 441 static FieldFormalParameter fieldFormalParameter2(String identifier) => fieldF ormalParameter(null, null, identifier);
441
442 static FieldFormalParameter fieldFormalParameter3(String identifier) => fieldF ormalParameter(null, null, identifier);
443 442
444 static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expr ession iterator, Statement body) => new ForEachStatement.con1(TokenFactory.token FromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), loop Variable, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.toke nFromType(TokenType.CLOSE_PAREN), body); 443 static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expr ession iterator, Statement body) => new ForEachStatement.con1(TokenFactory.token FromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), loop Variable, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.toke nFromType(TokenType.CLOSE_PAREN), body);
445 444
446 static FormalParameterList formalParameterList(List<FormalParameter> parameter s) => new FormalParameterList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN)) ; 445 static FormalParameterList formalParameterList(List<FormalParameter> parameter s) => new FormalParameterList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN)) ;
447 446
448 static ForStatement forStatement(Expression initialization, Expression conditi on, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory. tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), null, initialization, TokenFactory.tokenFromType(TokenType.SEMICOLON), conditio n, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFactory.token FromType(TokenType.CLOSE_PAREN), body); 447 static ForStatement forStatement(Expression initialization, Expression conditi on, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory. tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), null, initialization, TokenFactory.tokenFromType(TokenType.SEMICOLON), conditio n, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFactory.token FromType(TokenType.CLOSE_PAREN), body);
449 448
450 static ForStatement forStatement2(VariableDeclarationList variableList, Expres sion condition, List<Expression> updaters, Statement body) => new ForStatement(T okenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType. OPEN_PAREN), variableList, null, TokenFactory.tokenFromType(TokenType.SEMICOLON) , condition, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFac tory.tokenFromType(TokenType.CLOSE_PAREN), body); 449 static ForStatement forStatement2(VariableDeclarationList variableList, Expres sion condition, List<Expression> updaters, Statement body) => new ForStatement(T okenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType. OPEN_PAREN), variableList, null, TokenFactory.tokenFromType(TokenType.SEMICOLON) , condition, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFac tory.tokenFromType(TokenType.CLOSE_PAREN), body);
451 450
452 static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclaration( null, null, null, type, keyword == null ? null : TokenFactory.tokenFromKeyword(k eyword), identifier3(name), functionExpression); 451 static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclaration( null, null, null, type, keyword == null ? null : TokenFactory.tokenFromKeyword(k eyword), identifier3(name), functionExpression);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 JUnitTestCase.assertTrue(identifier.inDeclarationContext()); 753 JUnitTestCase.assertTrue(identifier.inDeclarationContext());
755 } 754 }
756 755
757 void test_inDeclarationContext_declaredIdentifier() { 756 void test_inDeclarationContext_declaredIdentifier() {
758 DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v"); 757 DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
759 SimpleIdentifier identifier = declaredIdentifier.identifier; 758 SimpleIdentifier identifier = declaredIdentifier.identifier;
760 JUnitTestCase.assertTrue(identifier.inDeclarationContext()); 759 JUnitTestCase.assertTrue(identifier.inDeclarationContext());
761 } 760 }
762 761
763 void test_inDeclarationContext_fieldFormalParameter() { 762 void test_inDeclarationContext_fieldFormalParameter() {
764 SimpleIdentifier identifier = AstFactory.fieldFormalParameter3("p").identifi er; 763 SimpleIdentifier identifier = AstFactory.fieldFormalParameter2("p").identifi er;
765 JUnitTestCase.assertFalse(identifier.inDeclarationContext()); 764 JUnitTestCase.assertFalse(identifier.inDeclarationContext());
766 } 765 }
767 766
768 void test_inDeclarationContext_functionDeclaration() { 767 void test_inDeclarationContext_functionDeclaration() {
769 SimpleIdentifier identifier = AstFactory.functionDeclaration(null, null, "f" , null).name; 768 SimpleIdentifier identifier = AstFactory.functionDeclaration(null, null, "f" , null).name;
770 JUnitTestCase.assertTrue(identifier.inDeclarationContext()); 769 JUnitTestCase.assertTrue(identifier.inDeclarationContext());
771 } 770 }
772 771
773 void test_inDeclarationContext_functionTypeAlias() { 772 void test_inDeclarationContext_functionTypeAlias() {
774 SimpleIdentifier identifier = AstFactory.typeAlias(null, "F", null, null).na me; 773 SimpleIdentifier identifier = AstFactory.typeAlias(null, "F", null, null).na me;
(...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after
2282 2281
2283 void test_visitConstructorName_unnamed_noPrefix() { 2282 void test_visitConstructorName_unnamed_noPrefix() {
2284 _assertSource("C", AstFactory.constructorName(AstFactory.typeName4("C", []), null)); 2283 _assertSource("C", AstFactory.constructorName(AstFactory.typeName4("C", []), null));
2285 } 2284 }
2286 2285
2287 void test_visitConstructorName_unnamed_prefix() { 2286 void test_visitConstructorName_unnamed_prefix() {
2288 _assertSource("p.C", AstFactory.constructorName(AstFactory.typeName3(AstFact ory.identifier5("p", "C"), []), null)); 2287 _assertSource("p.C", AstFactory.constructorName(AstFactory.typeName3(AstFact ory.identifier5("p", "C"), []), null));
2289 } 2288 }
2290 2289
2291 void test_visitContinueStatement_label() { 2290 void test_visitContinueStatement_label() {
2292 _assertSource("continue l;", AstFactory.continueStatement2("l")); 2291 _assertSource("continue l;", AstFactory.continueStatement("l"));
2293 } 2292 }
2294 2293
2295 void test_visitContinueStatement_noLabel() { 2294 void test_visitContinueStatement_noLabel() {
2296 _assertSource("continue;", AstFactory.continueStatement()); 2295 _assertSource("continue;", AstFactory.continueStatement());
2297 } 2296 }
2298 2297
2299 void test_visitDefaultFormalParameter_named_noValue() { 2298 void test_visitDefaultFormalParameter_named_noValue() {
2300 _assertSource("p", AstFactory.namedFormalParameter(AstFactory.simpleFormalPa rameter3("p"), null)); 2299 _assertSource("p", AstFactory.namedFormalParameter(AstFactory.simpleFormalPa rameter3("p"), null));
2301 } 2300 }
2302 2301
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 2355
2357 void test_visitFieldDeclaration_instance() { 2356 void test_visitFieldDeclaration_instance() {
2358 _assertSource("var a;", AstFactory.fieldDeclaration2(false, Keyword.VAR, [As tFactory.variableDeclaration("a")])); 2357 _assertSource("var a;", AstFactory.fieldDeclaration2(false, Keyword.VAR, [As tFactory.variableDeclaration("a")]));
2359 } 2358 }
2360 2359
2361 void test_visitFieldDeclaration_static() { 2360 void test_visitFieldDeclaration_static() {
2362 _assertSource("static var a;", AstFactory.fieldDeclaration2(true, Keyword.VA R, [AstFactory.variableDeclaration("a")])); 2361 _assertSource("static var a;", AstFactory.fieldDeclaration2(true, Keyword.VA R, [AstFactory.variableDeclaration("a")]));
2363 } 2362 }
2364 2363
2365 void test_visitFieldFormalParameter_functionTyped() { 2364 void test_visitFieldFormalParameter_functionTyped() {
2366 _assertSource("A this.a(b)", AstFactory.fieldFormalParameter2(null, AstFacto ry.typeName4("A", []), "a", AstFactory.formalParameterList([AstFactory.simpleFor malParameter3("b")]))); 2365 _assertSource("A this.a(b)", AstFactory.fieldFormalParameter(null, AstFactor y.typeName4("A", []), "a", AstFactory.formalParameterList([AstFactory.simpleForm alParameter3("b")])));
2367 } 2366 }
2368 2367
2369 void test_visitFieldFormalParameter_keyword() { 2368 void test_visitFieldFormalParameter_keyword() {
2370 _assertSource("var this.a", AstFactory.fieldFormalParameter(Keyword.VAR, nul l, "a")); 2369 _assertSource("var this.a", AstFactory.fieldFormalParameter(Keyword.VAR, nul l, "a"));
2371 } 2370 }
2372 2371
2373 void test_visitFieldFormalParameter_keywordAndType() { 2372 void test_visitFieldFormalParameter_keywordAndType() {
2374 _assertSource("final A this.a", AstFactory.fieldFormalParameter(Keyword.FINA L, AstFactory.typeName4("A", []), "a")); 2373 _assertSource("final A this.a", AstFactory.fieldFormalParameter(Keyword.FINA L, AstFactory.typeName4("A", []), "a"));
2375 } 2374 }
2376 2375
(...skipping 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after
4087 NodeLocatorTest.dartSuite(); 4086 NodeLocatorTest.dartSuite();
4088 ToSourceVisitorTest.dartSuite(); 4087 ToSourceVisitorTest.dartSuite();
4089 BreadthFirstVisitorTest.dartSuite(); 4088 BreadthFirstVisitorTest.dartSuite();
4090 ClassDeclarationTest.dartSuite(); 4089 ClassDeclarationTest.dartSuite();
4091 IndexExpressionTest.dartSuite(); 4090 IndexExpressionTest.dartSuite();
4092 NodeListTest.dartSuite(); 4091 NodeListTest.dartSuite();
4093 SimpleIdentifierTest.dartSuite(); 4092 SimpleIdentifierTest.dartSuite();
4094 SimpleStringLiteralTest.dartSuite(); 4093 SimpleStringLiteralTest.dartSuite();
4095 VariableDeclarationTest.dartSuite(); 4094 VariableDeclarationTest.dartSuite();
4096 } 4095 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698