| Index: dart/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
|
| diff --git a/dart/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java b/dart/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
|
| deleted file mode 100644
|
| index a106aa8e83962714eef982b8840902634b97986b..0000000000000000000000000000000000000000
|
| --- a/dart/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
|
| +++ /dev/null
|
| @@ -1,1876 +0,0 @@
|
| -// Copyright (c) 2012, 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.
|
| -package com.google.dart.compiler.end2end.inc;
|
| -
|
| -import com.google.common.base.Joiner;
|
| -import com.google.common.collect.Lists;
|
| -import com.google.common.collect.Maps;
|
| -import com.google.common.collect.Sets;
|
| -import com.google.dart.compiler.CompilerTestCase;
|
| -import com.google.dart.compiler.DartCompilationError;
|
| -import com.google.dart.compiler.DartCompiler;
|
| -import com.google.dart.compiler.DartCompilerErrorCode;
|
| -import com.google.dart.compiler.DartCompilerListener;
|
| -import com.google.dart.compiler.DartSource;
|
| -import com.google.dart.compiler.DefaultCompilerConfiguration;
|
| -import com.google.dart.compiler.LibrarySource;
|
| -import com.google.dart.compiler.MockArtifactProvider;
|
| -import com.google.dart.compiler.PackageLibraryManager;
|
| -import com.google.dart.compiler.Source;
|
| -import com.google.dart.compiler.UrlSource;
|
| -import com.google.dart.compiler.ast.DartUnit;
|
| -import com.google.dart.compiler.ast.LibraryUnit;
|
| -import com.google.dart.compiler.common.ErrorExpectation;
|
| -import com.google.dart.compiler.resolver.ResolverErrorCode;
|
| -import com.google.dart.compiler.resolver.TypeErrorCode;
|
| -import com.google.dart.compiler.type.TypeQuality;
|
| -
|
| -import static com.google.dart.compiler.DartCompiler.EXTENSION_DEPS;
|
| -import static com.google.dart.compiler.DartCompiler.EXTENSION_TIMESTAMP;
|
| -import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
|
| -import static com.google.dart.compiler.common.ErrorExpectation.errEx;
|
| -
|
| -import junit.framework.AssertionFailedError;
|
| -
|
| -import java.io.IOException;
|
| -import java.io.Reader;
|
| -import java.io.Writer;
|
| -import java.net.URI;
|
| -import java.util.List;
|
| -import java.util.Map;
|
| -import java.util.Set;
|
| -import java.util.concurrent.ConcurrentSkipListSet;
|
| -
|
| -// TODO(zundel): update this test not to rely on code generation
|
| -public class IncrementalCompilation2Test extends CompilerTestCase {
|
| - private static final String APP = "Application.dart";
|
| -
|
| - private static class IncMockArtifactProvider extends MockArtifactProvider {
|
| - Set<String> reads = new ConcurrentSkipListSet<String>();
|
| - Set<String> writes = new ConcurrentSkipListSet<String>();
|
| -
|
| - @Override
|
| - public Reader getArtifactReader(Source source, String part, String extension) {
|
| - reads.add(source.getName() + "/" + extension);
|
| - return super.getArtifactReader(source, part, extension);
|
| - }
|
| -
|
| - @Override
|
| - public Writer getArtifactWriter(Source source, String part, String extension) {
|
| - writes.add(source.getName() + "/" + extension);
|
| - return super.getArtifactWriter(source, part, extension);
|
| - }
|
| -
|
| - void resetReadsAndWrites() {
|
| - reads.clear();
|
| - writes.clear();
|
| - }
|
| - }
|
| -
|
| - private DefaultCompilerConfiguration config;
|
| - private IncMockArtifactProvider provider;
|
| - private MemoryLibrarySource appSource;
|
| - private final List<DartCompilationError> errors = Lists.newArrayList();
|
| - private final Map<String, DartUnit> units = Maps.newHashMap();
|
| -
|
| - @Override
|
| - protected void setUp() throws Exception {
|
| - config = new DefaultCompilerConfiguration() {
|
| - @Override
|
| - public boolean incremental() {
|
| - return true;
|
| - }
|
| - };
|
| - provider = new IncMockArtifactProvider();
|
| - appSource = new MemoryLibrarySource(APP);
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - "part 'B.dart';",
|
| - "part 'C.dart';",
|
| - ""));
|
| - appSource.setContent("A.dart", "part of application;");
|
| - appSource.setContent("B.dart", "part of application;");
|
| - appSource.setContent("C.dart", "part of application;");
|
| - }
|
| -
|
| - @Override
|
| - protected void tearDown() {
|
| - config = null;
|
| - provider = null;
|
| - appSource = null;
|
| - errors.clear();
|
| - units.clear();
|
| - }
|
| -
|
| - /**
|
| - * "not_hole" is referenced using "super" qualifier, so is not affected by declaring top-level
|
| - * field with same name.
|
| - */
|
| - public void test_useQualifiedFieldReference_ignoreTopLevelDeclaration() {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " int not_hole;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " int bar() {",
|
| - " return super.not_hole;", // qualified reference
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Update units and compile.
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "int not_hole;",
|
| - ""));
|
| - compile();
|
| - // TODO(scheglov) Fix this after 1159
|
| - //assertErrors(errors, errEx(ResolverErrorCode.DUPLICATE_LOCAL_VARIABLE_WARNING, -1, 7, 20));
|
| - // B should be compiled because it now conflicts with A.
|
| - // C should not be compiled, because it reference "not_hole" field, not top-level variable.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didNotWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| -
|
| - /**
|
| - * Referenced "hole" identifier can not be resolved, but when we declare it in A, then B should be
|
| - * recompiled and error message disappear.
|
| - */
|
| - public void test_useUnresolvedField_recompileOnTopLevelDeclaration() {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " int foo() {",
|
| - " return hole;", // no such field
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors, errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 5, 12, 4));
|
| - // Update units and compile.
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "int hole;",
|
| - ""));
|
| - compile();
|
| - // A and B should be compiled.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - // "hole" was filled with top-level field.
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Test for "hole" feature. If we use unqualified invocation and add/remove top-level method, this
|
| - * should cause compilation of invocation unit.
|
| - */
|
| - public void test_isMethodHole_useUnqualifiedInvocation() throws Exception {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " foo() {}",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " int bar() {",
|
| - " foo();", // unqualified invocation
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Declare top-level foo(), now invocation of foo() in B should be bound to this top-level.
|
| - {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "foo() {}",
|
| - ""));
|
| - compile();
|
| - // B should be compiled because it also declares foo(), so produces "shadow" conflict.
|
| - // C should be compiled because it has unqualified invocation which was declared in A.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| - // Wait, because analysis is so fast that may be A will have same time as old artifact.
|
| - Thread.sleep(5);
|
| - // Remove top-level foo(), so invocation of foo() in B should be bound to the super class.
|
| - {
|
| - appSource.setContent("A.dart", "part of application;");
|
| - compile();
|
| - // B should be compiled because it also declares foo(), so produces "shadow" conflict.
|
| - // C should be compiled because it has unqualified invocation which was declared in A.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Test for "hole" feature. If we use qualified invocation and add/remove top-level method, this
|
| - * should not cause compilation of invocation unit.
|
| - */
|
| - public void test_notMethodHole_useQualifiedInvocation() {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " foo() {}",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " int bar() {",
|
| - " super.foo();", // qualified invocation
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Declare top-level foo(), but it is ignored.
|
| - {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "foo() {}",
|
| - ""));
|
| - compile();
|
| - // B should be compiled because it also declares foo(), so produces "shadow" conflict.
|
| - // C should not be compiled because.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didNotWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Test for "hole" feature. If we use unqualified access and add/remove top-level field, this
|
| - * should cause compilation of invocation unit.
|
| - */
|
| - public void test_fieldHole_useUnqualifiedAccess() throws Exception {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " var foo;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " int bar() {",
|
| - " foo = 0;", // unqualified access
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Declare top-level "foo", now access to "foo" in B should be bound to this top-level.
|
| - {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var foo;",
|
| - ""));
|
| - compile();
|
| - // B should be compiled because it also declares "foo", so produces "shadow" conflict.
|
| - // C should be compiled because it has unqualified invocation which was declared in A.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| - // Wait, because analysis is so fast that may be A will have same time as old artifact.
|
| - Thread.sleep(5);
|
| - // Remove top-level "foo", so access to "foo" in B should be bound to the super class.
|
| - {
|
| - appSource.setContent("A.dart", "part of application;");
|
| - compile();
|
| - // B should be compiled because it also declares "foo", so produces "shadow" conflict.
|
| - // C should be compiled because it has unqualified access which was declared in A.
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Test for "hole" feature. If we use qualified access and add/remove top-level field, this should
|
| - * not cause compilation of invocation unit.
|
| - */
|
| - public void test_fieldHole_useQualifiedAccess() {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " var foo;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " int bar() {",
|
| - " super.foo = 0;", // qualified access
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Declare top-level "foo", but it is ignored.
|
| - {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var foo;",
|
| - ""));
|
| - compile();
|
| - // B should be compiled because it also declares "foo", so produces "shadow" conflict.
|
| - // C should not be compiled because it has qualified access to "foo".
|
| - didWrite("A.dart", EXTENSION_TIMESTAMP);
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - didNotWrite("C.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| - }
|
| -
|
| - public void test_declareTopLevel_conflictWithLocalVariable() {
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "methodB() {",
|
| - " var symbolDependency_foo;",
|
| - "}"));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Update units and compile.
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var symbolDependency_foo;"));
|
| - compile();
|
| - // Now there is top-level declarations conflict between A and B.
|
| - // So, B should be compiled.
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - // But application should be build.
|
| - assertAppBuilt();
|
| - }
|
| -
|
| - public void test_undeclareTopLevel_conflictWithLocalVariable() {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var duplicate;"));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "bar() {",
|
| - " var duplicate;",
|
| - "}"));
|
| - compile();
|
| - // Update units and compile.
|
| - appSource.setContent("A.dart", "part of application;");
|
| - compile();
|
| - // Top-level declaration in A was removed, so no conflict.
|
| - // So:
|
| - // ... B should be recompiled.
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - // ... but application should be rebuild.
|
| - assertAppBuilt();
|
| - }
|
| -
|
| - /**
|
| - * Removes A, so changes set of top level units and forces compilation.
|
| - */
|
| - public void test_removeOneSource() {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var duplicate;"));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "bar() {",
|
| - " var duplicate;",
|
| - "}"));
|
| - compile();
|
| - // Exclude A and compile.
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "part 'B.dart';",
|
| - ""));
|
| - compile();
|
| - // Now there is top-level declarations conflict between A and B.
|
| - // So:
|
| - // ... B should be recompiled.
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - // ... but application should be rebuild.
|
| - didWrite(APP, EXTENSION_DEPS);
|
| - }
|
| -
|
| - public void test_declareField_conflictWithLocalVariable() {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class B extends A {",
|
| - " foo() {",
|
| - " var bar;",
|
| - " }",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Update units and compile.
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "class A {",
|
| - " var bar;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - // B depends on A class, so compiled.
|
| - didWrite("B.dart", EXTENSION_TIMESTAMP);
|
| - assertAppBuilt();
|
| - }
|
| -
|
| - public void test_declareTopLevelVariable_conflictOtherTopLevelVariable() {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var conflict;",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - // Update units and compile.
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "var conflict;",
|
| - ""));
|
| - compile();
|
| - // A symbols intersect with new B symbols, so we compile A too.
|
| - // Both A and B have errors.
|
| - assertErrors(
|
| - errors,
|
| - errEx("A.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 3, 5, 8),
|
| - errEx("B.dart", ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, 3, 5, 8));
|
| - }
|
| -
|
| - /**
|
| - * Test that invalid "import" is reported as any other error between "unitAboutToCompile" and
|
| - * "unitCompiled".
|
| - */
|
| - public void test_reportMissingImport() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'dart:noSuchLib.dart';",
|
| - ""));
|
| - // Remember errors only between unitAboutToCompile/unitCompiled.
|
| - errors.clear();
|
| - DartCompilerListener listener = new DartCompilerListener.Empty() {
|
| - boolean isCompiling = false;
|
| -
|
| - @Override
|
| - public void unitAboutToCompile(DartSource source, boolean diet) {
|
| - isCompiling = true;
|
| - }
|
| -
|
| - @Override
|
| - public void onError(DartCompilationError event) {
|
| - if (isCompiling) {
|
| - errors.add(event);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void unitCompiled(DartUnit unit) {
|
| - isCompiling = false;
|
| - }
|
| - };
|
| - DartCompiler.compileLib(appSource, config, provider, listener);
|
| - // Check that errors where reported (and in correct time).
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 29));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=6859
|
| - */
|
| - public void test_reportMissingImport_dart() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'dart:mirrors as mirrors';",
|
| - ""));
|
| - compile();
|
| - // Check that errors where reported (and in correct time).
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 33));
|
| - }
|
| -
|
| - /**
|
| - * Test that same prefix can be used to import several libraries.
|
| - */
|
| - public void test_samePrefix_severalLibraries() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart' as p;",
|
| - "import 'B.dart' as p;",
|
| - "f() {",
|
| - " p.a = 1;",
|
| - " p.b = 2;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "var a;",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library B;",
|
| - "var b;",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Checks that it is a compile-time error when a library directly imports two other libraries that
|
| - * have the same library name.
|
| - */
|
| - public void test_importTwoLibraries_withSameName() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library duplicate_name;",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library duplicate_name;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(APP, DartCompilerErrorCode.DUPLICATE_IMPORTED_LIBRARY_NAME, 4, 1, 16));
|
| - }
|
| -
|
| - /**
|
| - * Checks valid library definitions with metadata.
|
| - */
|
| - public void test_importLibrary_withMetaBeforeLibraryDirective() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "@meta library A;",
|
| - "const int meta = 1;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Checks that it is not an error to use a multi-line string literal as a URI in a part directive.
|
| - * Even with leading whitespace since it's getting trimmed. Even with Windows \r\n style.
|
| - */
|
| - public void test_importLibrary_multiLineStringUri() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "var foo;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - Joiner.on("\r\n").join(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import '''",
|
| - "A.dart''';",
|
| - "main() {",
|
| - " foo;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Checks that it is a compile-time error when the library being exported does not have a library
|
| - * definition.
|
| - */
|
| - public void test_exportLibrary_withoutLibraryDirective() throws Exception {
|
| - appSource.setContent("A.dart", "");
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "export 'A.dart';",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(APP, DartCompilerErrorCode.MISSING_LIBRARY_DIRECTIVE_EXPORT, 3, 1, 16));
|
| - }
|
| -
|
| - /**
|
| - * Enabled in 0.13
|
| - */
|
| - public void test_exportLibrary_fromScript() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library myScript;",
|
| - "export 'A.dart';",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * It is neither an error nor a warning if N is introduced by two or more imports but never
|
| - * referred to.
|
| - */
|
| - public void test_importConflict_notUsed() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_importConflict_used_asTypeAnnotation() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "typedef Test MyTypeDef(Test p);",
|
| - "Test myFunction(Test p) {",
|
| - " Test test;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE, 5, 24, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE, 5, 9, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE, 6, 17, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE, 6, 1, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME_TYPE, 7, 3, 4));
|
| - }
|
| -
|
| - public void test_importConflict_used_notTypeAnnotation_1() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "class A extends Test {}",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME, 5, 17, 4));
|
| - }
|
| -
|
| - public void test_importConflict_used_notTypeAnnotation_2() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "main() {",
|
| - " Test();",
|
| - " Test.FOO;",
|
| - " Test = 0;",
|
| - " 0 is Test;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME, 6, 3, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME, 7, 3, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME, 8, 3, 4),
|
| - errEx(APP, ResolverErrorCode.DUPLICATE_IMPORTED_NAME, 9, 8, 4));
|
| - }
|
| -
|
| - public void test_importConflict_used_notTypeAnnotation_3() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart' hide Test;",
|
| - "import 'B.dart';",
|
| - "class A extends Test {}",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_importConflict_used_inCommentRef() throws Exception {
|
| - prepare_importConflictAB();
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart';",
|
| - "import 'B.dart';",
|
| - "/** [Test] */",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=6824
|
| - */
|
| - public void test_exportConflict() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_a;",
|
| - "class Test {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_b;",
|
| - "class Test {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "export 'A.dart';",
|
| - "export 'B.dart';",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors, errEx(APP, ResolverErrorCode.DUPLICATE_EXPORTED_NAME, 4, 1, 16));
|
| - }
|
| -
|
| - private void prepare_importConflictAB() {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_a;",
|
| - "class Test {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_b;",
|
| - "class Test {}",
|
| - ""));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=5735
|
| - */
|
| - public void test_importConflict_hideNoPrefix_importAgainWithPrefix() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_a;",
|
| - "var E = 2.7;",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib_b;",
|
| - "export 'A.dart' show E;",
|
| - "var E = 'E';",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'B.dart';",
|
| - "import 'A.dart' as M show E;",
|
| - "main() {",
|
| - " print(E);",
|
| - " print(M.E);",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_reportMissingSource() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "part 'noSuchUnit.dart';",
|
| - ""));
|
| - compile();
|
| - // Check that errors where reported (and in correct time).
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_SOURCE, 3, 1, 23));
|
| - }
|
| -
|
| - public void test_reportMissingSource_withSchema_file() throws Exception {
|
| - URI uri = new URI("file:noSuchSource.dart");
|
| - Source source = new UrlSource(uri) {
|
| - @Override
|
| - public String getName() {
|
| - return null;
|
| - }
|
| - };
|
| - // should not cause exception
|
| - assertFalse(source.exists());
|
| - }
|
| -
|
| - public void test_reportMissingSource_withSchema_dart() throws Exception {
|
| - URI uri = new URI("dart:noSuchSource");
|
| - Source source = new UrlSource(uri, new PackageLibraryManager()) {
|
| - @Override
|
| - public String getName() {
|
| - return null;
|
| - }
|
| - };
|
| - // should not cause exception
|
| - assertFalse(source.exists());
|
| - }
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=3532
|
| - */
|
| - public void test_includeSameUnitTwice() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - "part 'A.dart';",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.UNIT_WAS_ALREADY_INCLUDED, 4, 1, 14));
|
| - }
|
| -
|
| - /**
|
| - * There was bug that we added <code>null</code> into {@link LibraryUnit#getImports()}. Here trick
|
| - * is that we reference "existing" {@link Source}, which can not be read.
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=2693
|
| - */
|
| - public void test_ignoreNullLibrary() throws Exception {
|
| - appSource.setContent("canNotRead.dart", MemoryLibrarySource.IO_EXCEPTION_CONTENT);
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'canNotRead.dart';",
|
| - ""));
|
| - // use same config as Editor - resolve despite of errors
|
| - config = new DefaultCompilerConfiguration() {
|
| - @Override
|
| - public boolean resolveDespiteParseErrors() {
|
| - return true;
|
| - }
|
| - };
|
| - // Ignore errors, but we should not get exceptions.
|
| - compile();
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=4072
|
| - */
|
| - public void test_inaccessibleMethod_fromOtherLibrary_static() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "class A {",
|
| - " static _privateStatic() {}",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart';",
|
| - "main() {",
|
| - " A._privateStatic();",
|
| - "}",
|
| - ""));
|
| - // do compile, check errors
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(ResolverErrorCode.ILLEGAL_ACCESS_TO_PRIVATE, 5, 5, 14));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=4072
|
| - */
|
| - public void test_inaccessibleMethod_fromOtherLibrary_instance() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "class A {",
|
| - " _privateInstance() {}",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart';",
|
| - "main() {",
|
| - " A a = new A();",
|
| - " a._privateInstance();",
|
| - "}",
|
| - ""));
|
| - // do compile, check errors
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(TypeErrorCode.ILLEGAL_ACCESS_TO_PRIVATE, 6, 5, 16));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=3266
|
| - */
|
| - public void test_inaccessibleSuperMethod_fromOtherLibrary() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "class A {",
|
| - " _method() {}",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart';",
|
| - "class B extends A {",
|
| - " test1() {",
|
| - " _method();",
|
| - " }",
|
| - " test2() {",
|
| - " super._method();",
|
| - " }",
|
| - "}",
|
| - ""));
|
| - // do compile, check errors
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(ResolverErrorCode.CANNOT_ACCESS_METHOD, 6, 5, 7),
|
| - errEx(ResolverErrorCode.CANNOT_ACCESS_METHOD, 9, 11, 7));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=6822
|
| - */
|
| - public void test_useImportPrefix_asVariableName() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart' as prf;",
|
| - "main() {",
|
| - " var prf;",
|
| - "}",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=3340
|
| - */
|
| - public void test_useImportPrefix_asTopLevelFieldName() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart' as prf;",
|
| - "var prf;",
|
| - "main() {",
|
| - "}",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors, errEx(ResolverErrorCode.CANNOT_HIDE_IMPORT_PREFIX, 4, 5, 3));
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_show() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "class TypeA {}",
|
| - "class TypeB {}",
|
| - "class TypeC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart' as libA show TypeA, TypeB;",
|
| - "main() {",
|
| - " libA.TypeA v1;",
|
| - " libA.TypeB v2;",
|
| - " libA.TypeC v3;",
|
| - "}",
|
| - ""));
|
| - // TypeC not listed in "show"
|
| - compile();
|
| - assertErrors(errors, errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 10));
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_hide() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "class TypeA {}",
|
| - "class TypeB {}",
|
| - "class TypeC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'A.dart' as libA hide TypeC;",
|
| - "main() {",
|
| - " libA.TypeA v1;",
|
| - " libA.TypeB v2;",
|
| - " libA.TypeC v3;",
|
| - "}",
|
| - ""));
|
| - // TypeC is listed in "hide"
|
| - compile();
|
| - assertErrors(errors, errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 10));
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_export_show() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "class TypeAA {}",
|
| - "class TypeAB {}",
|
| - "class TypeAC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.B;",
|
| - "export 'A.dart' show TypeAA, TypeAB;",
|
| - "class TypeBA {}",
|
| - "class TypeBB {}",
|
| - "class TypeBC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'B.dart' as libB hide TypeAA, TypeBB;",
|
| - "main() {",
|
| - " libB.TypeAA aa;",
|
| - " libB.TypeAB ab;",
|
| - " libB.TypeAC ac;",
|
| - " libB.TypeBA ba;",
|
| - " libB.TypeBB bb;",
|
| - " libB.TypeBC bc;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 5, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 9, 3, 11));
|
| - assertTrue(errors.toString().contains("libB.TypeAA"));
|
| - assertTrue(errors.toString().contains("libB.TypeAC"));
|
| - assertTrue(errors.toString().contains("libB.TypeBB"));
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_export2() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libA;",
|
| - "class SourceString {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libB;",
|
| - "import 'C.dart';",
|
| - "export 'A.dart' show SourceString;",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libC;",
|
| - "import 'B.dart';",
|
| - "foo() {",
|
| - " SourceString s;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'B.dart';",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_export3() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libA;",
|
| - "class SourceString {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libB;",
|
| - "export 'C.dart';",
|
| - "export 'A.dart' show SourceString;",
|
| - ""));
|
| - appSource.setContent(
|
| - "C.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library libC;",
|
| - "import 'B.dart';",
|
| - "foo() {",
|
| - " SourceString s;",
|
| - "}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'B.dart';",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_export4() throws Exception {
|
| - appSource.setContent(
|
| - "p1.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib1;",
|
| - "export 'p3.dart';",
|
| - ""));
|
| - appSource.setContent(
|
| - "p2.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib2;",
|
| - "export 'p3.dart';",
|
| - ""));
|
| - appSource.setContent(
|
| - "p3.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library lib3;",
|
| - "class MyClass {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library app;",
|
| - "import 'p1.dart' hide MyClass;",
|
| - "import 'p2.dart';",
|
| - "MyClass topLevelField;",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_export_hide() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "class TypeAA {}",
|
| - "class TypeAB {}",
|
| - "class TypeAC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.B;",
|
| - "export 'A.dart' hide TypeAC;",
|
| - "class TypeBA {}",
|
| - "class TypeBB {}",
|
| - "class TypeBC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'B.dart' as libB hide TypeAA, TypeBB;",
|
| - "main() {",
|
| - " libB.TypeAA aa;",
|
| - " libB.TypeAB ab;",
|
| - " libB.TypeAC ac;",
|
| - " libB.TypeBA ba;",
|
| - " libB.TypeBB bb;",
|
| - " libB.TypeBC bc;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 5, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 9, 3, 11));
|
| - assertTrue(errors.toString().contains("libB.TypeAA"));
|
| - assertTrue(errors.toString().contains("libB.TypeAC"));
|
| - assertTrue(errors.toString().contains("libB.TypeBB"));
|
| - }
|
| -
|
| - public void test_newLibrarySyntax_noExport() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "class TypeAA {}",
|
| - "class TypeAB {}",
|
| - "class TypeAC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.B;",
|
| - "import 'A.dart' as libA;",
|
| - "class TypeBA {}",
|
| - "class TypeBB {}",
|
| - "class TypeBC {}",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'B.dart' as libB;",
|
| - "main() {",
|
| - " libB.TypeAA aa;",
|
| - " libB.TypeAB ab;",
|
| - " libB.TypeAC ac;",
|
| - " libB.TypeBA ba;",
|
| - " libB.TypeBB bb;",
|
| - " libB.TypeBC bc;",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 5, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 6, 3, 11),
|
| - errEx(TypeErrorCode.NO_SUCH_TYPE, 7, 3, 11));
|
| - assertTrue(errors.toString().contains("libB.TypeAA"));
|
| - assertTrue(errors.toString().contains("libB.TypeAB"));
|
| - assertTrue(errors.toString().contains("libB.TypeAC"));
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=7598
|
| - */
|
| - public void test_newLibrarySyntax_export_withMetadata() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.A;",
|
| - "var a = 0;",
|
| - ""));
|
| - appSource.setContent(
|
| - "B.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.B;",
|
| - "@meta export 'A.dart';",
|
| - "const meta = 'meta!';",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library test.app;",
|
| - "import 'B.dart';",
|
| - "main() {",
|
| - " print(a);",
|
| - "}",
|
| - ""));
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=4238
|
| - */
|
| - public void test_typesPropagation_html_query() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'dart:html';",
|
| - "main() {",
|
| - " var v1 = query('a');",
|
| - " var v2 = query('A');",
|
| - " var v3 = query('body:active');",
|
| - " var v4 = query('button[foo=\"bar\"]');",
|
| - " var v5 = query('div.class');",
|
| - " var v6 = query('input#id');",
|
| - " var v7 = query('select#id');",
|
| - " // invocation of method",
|
| - " var m1 = document.query('div');",
|
| - " // unsupported currently",
|
| - " var b1 = query('noSuchTag');",
|
| - " var b2 = query('DART_EDITOR_NO_SUCH_TYPE');",
|
| - " var b3 = query('body div');",
|
| - "}",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors);
|
| - // validate types
|
| - DartUnit unit = units.get(APP);
|
| - assertNotNull(unit);
|
| - assertInferredElementTypeString(unit, "v1", "AnchorElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v2", "AnchorElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v3", "BodyElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v4", "ButtonElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v5", "DivElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v6", "InputElement", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "v7", "SelectElement", TypeQuality.INFERRED);
|
| - // invocation of method
|
| - assertInferredElementTypeString(unit, "m1", "DivElement", TypeQuality.INFERRED);
|
| - // bad cases, or unsupported now
|
| - assertInferredElementTypeString(unit, "b1", "Element", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "b2", "Element", TypeQuality.INFERRED);
|
| - assertInferredElementTypeString(unit, "b3", "Element", TypeQuality.INFERRED);
|
| - }
|
| -
|
| - /**
|
| - * Libraries "dart:io" and "dart:html" can not be used together in single application.
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=3839
|
| - */
|
| - public void test_consoleWebMix() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'dart:io';",
|
| - "import 'dart:html';",
|
| - ""));
|
| - // do compiled
|
| - compile();
|
| - // find expected error
|
| - boolean found = false;
|
| - for (DartCompilationError error : errors) {
|
| - found |= error.getErrorCode() == DartCompilerErrorCode.CONSOLE_WEB_MIX;
|
| - }
|
| - assertTrue(found);
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=3531
|
| - * <p>
|
| - * Revised 2012-12-12 - specification has no rule about import prefix and built-in identifier.
|
| - */
|
| - public void test_builtInIdentifier_asImportPrefix() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart' as abstract;",
|
| - "import 'A.dart' as as;",
|
| - "import 'A.dart' as dynamic;",
|
| - "import 'A.dart' as export;",
|
| - "import 'A.dart' as external;",
|
| - "import 'A.dart' as factory;",
|
| - "import 'A.dart' as get;",
|
| - "import 'A.dart' as implements;",
|
| - "import 'A.dart' as import;",
|
| - "import 'A.dart' as library;",
|
| - "import 'A.dart' as operator;",
|
| - "import 'A.dart' as part;",
|
| - "import 'A.dart' as set;",
|
| - "import 'A.dart' as static;",
|
| - "import 'A.dart' as typedef;",
|
| - "main() {",
|
| - " var prf;",
|
| - "}",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertEquals(0, errors.size());
|
| - }
|
| -
|
| - public void test_implicitlyImportCore() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'dart:core';",
|
| - ""));
|
| - compile();
|
| - ErrorExpectation.assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Investigation of failing "language/ct_const4_test".
|
| - */
|
| - public void test_useConstFromLib() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "final B = 1;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "import 'A.dart' as mylib;",
|
| - "final A = mylib.B;",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * Part should have one and only one directive - "part of".
|
| - */
|
| - public void test_partDirectives_otherThenPartOf() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - ""));
|
| - // do compile
|
| - compile();
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT, 2, 1, 10));
|
| - }
|
| -
|
| - /**
|
| - * Part should have one and only one directive - "part of".
|
| - */
|
| - public void test_partDirectives_otherThenPartOf2() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of application;",
|
| - "part 'A.dart';",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - ""));
|
| - // do compile
|
| - compile();
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.ILLEGAL_DIRECTIVES_IN_SOURCED_UNIT, 2, 1, 20));
|
| - }
|
| -
|
| - /**
|
| - * Part should have one and only one directive - "part of".
|
| - */
|
| - public void test_partDirectives_noPartOf() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - ""));
|
| - // do compile
|
| - compile();
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.MISSING_PART_OF_DIRECTIVE, -1, -1, 0));
|
| - }
|
| -
|
| - /**
|
| - * Part should have one and only one directive - "part of".
|
| - */
|
| - public void test_partDirectives_wrongNameInPartOf() throws Exception {
|
| - appSource.setContent(
|
| - "A.dart",
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "part of Z;",
|
| - ""));
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library application;",
|
| - "part 'A.dart';",
|
| - ""));
|
| - // do compile
|
| - compile();
|
| - assertErrors(
|
| - errors,
|
| - errEx(DartCompilerErrorCode.WRONG_PART_OF_NAME, 2, 1, 10),
|
| - errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 2, 9, 1));
|
| - }
|
| -
|
| - /**
|
| - * Internals of Dart use "dart-ext:" import scheme, and these libraries are allowed to use
|
| - * "native". New import syntax.
|
| - */
|
| - public void test_useNative_withDartExt_new() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode(
|
| - "// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "library A;",
|
| - "import 'dart-ext:test_extension';",
|
| - "class A {",
|
| - " static int ifNull(a, b) native 'TestExtension_IfNull';",
|
| - "}",
|
| - ""));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors);
|
| - }
|
| -
|
| - /**
|
| - * <p>
|
| - * http://code.google.com/p/dart/issues/detail?id=6077
|
| - */
|
| - public void test_dartMirrors_notFullyImplemented() throws Exception {
|
| - appSource.setContent(
|
| - APP,
|
| - makeCode("// filler filler filler filler filler filler filler filler filler filler filler",
|
| - "import 'dart:mirrors';"));
|
| - // do compile, no errors expected
|
| - compile();
|
| - assertErrors(errors, errEx(DartCompilerErrorCode.MIRRORS_NOT_FULLY_IMPLEMENTED, 2, 1, 22));
|
| - }
|
| -
|
| - private void assertAppBuilt() {
|
| - didWrite(APP, EXTENSION_DEPS);
|
| - }
|
| -
|
| - private void compile() {
|
| - compile(appSource);
|
| - }
|
| -
|
| - private void compile(LibrarySource lib) {
|
| - try {
|
| - provider.resetReadsAndWrites();
|
| - errors.clear();
|
| - DartCompilerListener listener = new DartCompilerListener.Empty() {
|
| - Set<URI> compilingUris = Sets.newHashSet();
|
| -
|
| - @Override
|
| - public void unitAboutToCompile(DartSource source, boolean diet) {
|
| - compilingUris.add(source.getUri());
|
| - }
|
| -
|
| - @Override
|
| - public void onError(DartCompilationError event) {
|
| - // ignore deprecated
|
| - if (event.getErrorCode() == TypeErrorCode.DEPRECATED_ELEMENT) {
|
| - return;
|
| - }
|
| - // Remember errors only between unitAboutToCompile/unitCompiled.
|
| - Source source = event.getSource();
|
| - if (source != null && compilingUris.contains(source.getUri())) {
|
| - errors.add(event);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void unitCompiled(DartUnit unit) {
|
| - compilingUris.remove(unit.getSourceInfo().getSource().getUri());
|
| - units.put(unit.getSourceName(), unit);
|
| - }
|
| - };
|
| - DartCompiler.compileLib(lib, config, provider, listener);
|
| - } catch (IOException e) {
|
| - throw new AssertionFailedError("Unexpected IOException: " + e.getMessage());
|
| - }
|
| - }
|
| -
|
| - private void didWrite(String sourceName, String extension) {
|
| - String spec = sourceName + "/" + extension;
|
| - assertTrue("Expected write: " + spec, provider.writes.contains(spec));
|
| - }
|
| -
|
| - private void didNotWrite(String sourceName, String extension) {
|
| - String spec = sourceName + "/" + extension;
|
| - assertFalse("Didn't expect write: " + spec, provider.writes.contains(spec));
|
| - }
|
| -}
|
|
|