Add some initial resolution tests for literals

Change-Id: I024321b355ed56abaec86c6c423d6af42ee3f6a2
Reviewed-on: https://dart-review.googlesource.com/54527
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/test/src/fasta/resolution_test.dart b/pkg/analyzer/test/src/fasta/resolution_test.dart
new file mode 100644
index 0000000..b241874
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/resolution_test.dart
@@ -0,0 +1,328 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io' show File;
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/fasta/ast_body_builder.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import "package:front_end/src/api_prototype/front_end.dart";
+import "package:front_end/src/api_prototype/memory_file_system.dart";
+import "package:front_end/src/base/processed_options.dart";
+import "package:front_end/src/compute_platform_binaries_location.dart";
+import 'package:front_end/src/fasta/compiler_context.dart';
+import 'package:front_end/src/fasta/constant_context.dart';
+import 'package:front_end/src/fasta/dill/dill_target.dart';
+import "package:front_end/src/fasta/fasta_codes.dart";
+import 'package:front_end/src/fasta/kernel/body_builder.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
+import "package:front_end/src/fasta/kernel/kernel_target.dart";
+import 'package:front_end/src/fasta/modifier.dart' as Modifier;
+import 'package:front_end/src/fasta/parser/parser.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/ticker.dart';
+import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
+import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
+import 'package:front_end/src/fasta/uri_translator_impl.dart';
+import 'package:kernel/class_hierarchy.dart' as kernel;
+import 'package:kernel/core_types.dart' as kernel;
+import 'package:kernel/kernel.dart' as kernel;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/parser_test.dart';
+
+main() async {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ResolutionTest);
+  });
+}
+
+/**
+ * Implementation of [AbstractParserTestCase] specialized for testing building
+ * Analyzer AST using the fasta [Forest] API.
+ */
+class FastaParserTestCase {
+  // TODO(danrubel): Consider HybridFileSystem.
+  static final MemoryFileSystem fs =
+      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
+
+  /// The custom URI used to locate the dill file in the MemoryFileSystem.
+  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
+
+  /// The in memory test code URI
+  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
+
+  static ProcessedOptions options;
+
+  static KernelTarget kernelTarget;
+
+  static TypeProvider _typeProvider;
+
+  TypeProvider get typeProvider => _typeProvider;
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  Expression parseExpression(String code) {
+    ScannerResult scan = scanString(code);
+
+    return CompilerContext.runWithOptions(options, (CompilerContext c) {
+      KernelLibraryBuilder library = new KernelLibraryBuilder(
+        entryPoint,
+        entryPoint,
+        kernelTarget.loader,
+        null /* actualOrigin */,
+        null /* enclosingLibrary */,
+      );
+      List<KernelTypeVariableBuilder> typeVariableBuilders =
+          <KernelTypeVariableBuilder>[];
+      List<KernelFormalParameterBuilder> formalParameterBuilders =
+          <KernelFormalParameterBuilder>[];
+      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
+          null /* metadata */,
+          Modifier.staticMask /* or Modifier.varMask */,
+          kernelTarget.dynamicType,
+          "analyzerTest",
+          typeVariableBuilders,
+          formalParameterBuilders,
+          kernel.ProcedureKind.Method,
+          library,
+          -1 /* charOffset */,
+          -1 /* charOpenParenOffset */,
+          -1 /* charEndOffset */);
+
+      TypeInferrerDisabled typeInferrer =
+          new TypeInferrerDisabled(new TypeSchemaEnvironment(
+        kernelTarget.loader.coreTypes,
+        kernelTarget.loader.hierarchy,
+        // TODO(danrubel): Enable strong mode.
+        false /* strong mode */,
+      ));
+
+      BodyBuilder builder = new AstBodyBuilder(
+        library,
+        procedureBuilder,
+        library.scope,
+        procedureBuilder.computeFormalParameterScope(library.scope),
+        kernelTarget.loader.hierarchy,
+        kernelTarget.loader.coreTypes,
+        null /* classBuilder */,
+        false /* isInstanceMember */,
+        null /* uri */,
+        typeInferrer,
+      )..constantContext = ConstantContext.none; // .inferred ?
+
+      Parser parser = new Parser(builder);
+      parser.parseExpression(parser.syntheticPreviousToken(scan.tokens));
+      return builder.pop();
+    });
+  }
+
+  Future setUp() async {
+    // TODO(danrubel): Tear down once all tests in group have been run.
+    if (options != null) {
+      return;
+    }
+
+    // Read the dill file containing kernel platform summaries into memory.
+    List<int> sdkSummaryBytes = await new File.fromUri(
+            computePlatformBinariesLocation().resolve("vm_platform.dill"))
+        .readAsBytes();
+    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
+
+    final CompilerOptions optionBuilder = new CompilerOptions()
+      ..strongMode = false // TODO(danrubel): enable strong mode.
+      ..reportMessages = true
+      ..verbose = false
+      ..fileSystem = fs
+      ..sdkSummary = sdkSummary
+      ..onProblem = (FormattedMessage problem, Severity severity,
+          List<FormattedMessage> context) {
+        // TODO(danrubel): Capture problems and check against expectations.
+        print(problem.formatted);
+      };
+
+    options = new ProcessedOptions(optionBuilder, false, [entryPoint]);
+
+    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
+
+    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
+      DillTarget dillTarget = new DillTarget(
+          new Ticker(isVerbose: false), uriTranslator, options.target);
+
+      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
+
+      // Load the dill file containing platform code.
+      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
+      kernel.Component sdkComponent =
+          kernel.loadComponentFromBytes(sdkSummaryBytes);
+      dillTarget.loader
+          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
+      await dillTarget.buildOutlines();
+      await kernelTarget.buildOutlines();
+      kernelTarget.computeCoreTypes();
+      assert(kernelTarget.loader.coreTypes != null);
+      Map<String, Element> map = <String, Element>{};
+      var coreTypes = kernelTarget.loader.coreTypes;
+      for (var coreType in [
+        coreTypes.boolClass,
+        coreTypes.doubleClass,
+        coreTypes.functionClass,
+        coreTypes.futureClass,
+        coreTypes.futureOrClass,
+        coreTypes.intClass,
+        coreTypes.iterableClass,
+        coreTypes.iteratorClass,
+        coreTypes.listClass,
+        coreTypes.mapClass,
+        coreTypes.nullClass,
+        coreTypes.numClass,
+        coreTypes.objectClass,
+        coreTypes.stackTraceClass,
+        coreTypes.streamClass,
+        coreTypes.stringClass,
+        coreTypes.symbolClass,
+        coreTypes.typeClass
+      ]) {
+        map[coreType.name] = _buildElement(coreType);
+      }
+      Namespace namespace = new Namespace(map);
+      _typeProvider = new TypeProviderImpl.forNamespaces(namespace, namespace);
+    });
+  }
+
+  Element _buildElement(kernel.Class coreType) {
+    ClassElementImpl element =
+        new ClassElementImpl(coreType.name, coreType.fileOffset);
+    element.typeParameters = coreType.typeParameters.map((parameter) {
+      TypeParameterElementImpl element =
+          new TypeParameterElementImpl(parameter.name, parameter.fileOffset);
+      element.type = new TypeParameterTypeImpl(element);
+      return element;
+    }).toList();
+    return element;
+  }
+}
+
+// TODO(ahe): Remove this class when we no longer need to override `forest`.
+/**
+ * Tests of the fasta parser based on [ExpressionParserTestMixin].
+ */
+@reflectiveTest
+class ResolutionTest extends FastaParserTestCase {
+  @failingTest
+  test_booleanLiteral_false() {
+    Expression result = parseExpression('false');
+    expect(result, new isInstanceOf<BooleanLiteral>());
+    expect((result as BooleanLiteral).staticType,
+        FastaParserTestCase._typeProvider.boolType);
+  }
+
+  @failingTest
+  test_booleanLiteral_true() {
+    Expression result = parseExpression('true');
+    expect(result, new isInstanceOf<BooleanLiteral>());
+    expect((result as BooleanLiteral).staticType,
+        FastaParserTestCase._typeProvider.boolType);
+  }
+
+  @failingTest
+  test_doubleLiteral_negative() {
+    Expression result = parseExpression('-5.1');
+    expect(result, new isInstanceOf<DoubleLiteral>());
+    expect((result as DoubleLiteral).staticType,
+        FastaParserTestCase._typeProvider.doubleType);
+  }
+
+  @failingTest
+  test_doubleLiteral_positive() {
+    Expression result = parseExpression('4.2');
+    expect(result, new isInstanceOf<DoubleLiteral>());
+    expect((result as DoubleLiteral).staticType,
+        FastaParserTestCase._typeProvider.doubleType);
+  }
+
+  @failingTest
+  test_integerLiteral_negative() {
+    Expression result = parseExpression('-6');
+    expect(result, new isInstanceOf<IntegerLiteral>());
+    expect((result as IntegerLiteral).staticType,
+        FastaParserTestCase._typeProvider.intType);
+  }
+
+  @failingTest
+  test_integerLiteral_positive() {
+    Expression result = parseExpression('3');
+    expect(result, new isInstanceOf<IntegerLiteral>());
+    expect((result as IntegerLiteral).staticType,
+        FastaParserTestCase._typeProvider.intType);
+  }
+
+  @failingTest
+  test_listLiteral_explicitType() {
+    Expression result = parseExpression('<int>[]');
+    expect(result, new isInstanceOf<ListLiteral>());
+    InterfaceType listType = FastaParserTestCase._typeProvider.listType;
+    expect((result as ListLiteral).staticType,
+        listType.instantiate([FastaParserTestCase._typeProvider.intType]));
+  }
+
+  @failingTest
+  test_listLiteral_noType() {
+    Expression result = parseExpression('[]');
+    expect(result, new isInstanceOf<ListLiteral>());
+    InterfaceType listType = FastaParserTestCase._typeProvider.listType;
+    expect((result as ListLiteral).staticType,
+        listType.instantiate([FastaParserTestCase._typeProvider.dynamicType]));
+  }
+
+  @failingTest
+  test_mapLiteral_explicitType() {
+    Expression result = parseExpression('<String, int>{}');
+    expect(result, new isInstanceOf<MapLiteral>());
+    InterfaceType mapType = FastaParserTestCase._typeProvider.mapType;
+    expect(
+        (result as MapLiteral).staticType,
+        mapType.instantiate([
+          FastaParserTestCase._typeProvider.stringType,
+          FastaParserTestCase._typeProvider.intType
+        ]));
+  }
+
+  @failingTest
+  test_mapLiteral_noType() {
+    Expression result = parseExpression('{}');
+    expect(result, new isInstanceOf<MapLiteral>());
+    InterfaceType mapType = FastaParserTestCase._typeProvider.mapType;
+    expect(
+        (result as MapLiteral).staticType,
+        mapType.instantiate([
+          FastaParserTestCase._typeProvider.dynamicType,
+          FastaParserTestCase._typeProvider.dynamicType
+        ]));
+  }
+
+  @failingTest
+  test_nullLiteral_negative() {
+    Expression result = parseExpression('null');
+    expect(result, new isInstanceOf<NullLiteral>());
+    expect((result as NullLiteral).staticType,
+        FastaParserTestCase._typeProvider.nullType);
+  }
+
+  @failingTest
+  test_simpleStringLiteral() {
+    Expression result = parseExpression('"abc"');
+    expect(result, new isInstanceOf<SimpleStringLiteral>());
+    expect((result as SimpleStringLiteral).staticType,
+        FastaParserTestCase._typeProvider.stringType);
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 036a911..675b470 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -8,6 +8,7 @@
 import 'message_coverage_test.dart' as message_coverage;
 import 'recovery/test_all.dart' as recovery;
 import 'resolution_applier_test.dart' as resolution_applier;
+import 'resolution_test.dart' as resolution;
 
 main() {
   defineReflectiveSuite(() {
@@ -15,5 +16,6 @@
     message_coverage.main();
     recovery.main();
     resolution_applier.main();
+    resolution.main();
   }, name: 'fasta');
 }