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

Unified Diff: pkg/analyzer/test/generated/resolver_test.dart

Issue 2439583003: Validate local resolution scope, and compute initial name scope. (Closed)
Patch Set: Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/test/generated/resolver_test.dart
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 23f67c85d266b1e77702440bbc6f308df28e269d..32685920d62205095404c0d4299e6c43ffb5772f 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -2695,7 +2695,9 @@ A V = new A();
}
void test_modeLocal_noContext() {
- CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+ CompilationUnit unit;
+ _resolveTypeModeLocal(
+ r'''
class C {
A f = new A();
A m([A p = const A()]) {
@@ -2710,31 +2712,10 @@ A f([A p = const A()]) {
}
A V = new A();
A get G => new A();
-''');
- var unitElement = new CompilationUnitElementImpl('/test.dart');
- ClassElementImpl A = ElementFactory.classElement2('A');
-
- // Build API elements.
- {
- var holder = new ElementHolder();
- unit.accept(new ElementBuilder(holder, unitElement));
- }
-
- // Resolve API types.
- {
- MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
- InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
- resourceProvider: resourceProvider);
- var source = resourceProvider.getFile('/test.dart').createSource();
- var libraryElement = new LibraryElementImpl.forNode(context, null)
- ..definingCompilationUnit = unitElement;
- var libraryScope = new LibraryScope(libraryElement);
- var visitor = new TypeResolverVisitor(
- libraryElement, source, _typeProvider, _listener,
- nameScope: libraryScope, mode: TypeResolverMode.local);
- libraryScope.define(A);
- unit.accept(visitor);
- }
+''', (CompilationUnit u) {
+ unit = u;
+ return u;
+ });
// Top-level: C
{
@@ -2827,6 +2808,161 @@ A get G => new A();
}
}
+ void test_modeLocal_withContext_class() {
+ ClassDeclaration c;
+ _resolveTypeModeLocal(
+ r'''
+class C<T1> {
+ A m<T2>() {
+ T1 v1;
+ T2 v2;
+ }
+}
+''', (CompilationUnit u) {
+ c = u.declarations[0] as ClassDeclaration;
+ return c;
+ });
+ var m = c.members[0] as MethodDeclaration;
+
+ // The return type of "m" is not resolved.
+ expect(m.returnType.type, isNull);
+
+ var mb = m.body as BlockFunctionBody;
+ var ms = mb.block.statements;
+
+ // The type of "v1" is resolved.
+ {
+ var vd = ms[0] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T1');
+ }
+
+ // The type of "v2" is resolved.
+ {
+ var vd = ms[1] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T2');
+ }
+ }
+
+ void test_modeLocal_withContext_inClass_constructor() {
+ ConstructorDeclaration cc;
+ _resolveTypeModeLocal(
+ r'''
+class C<T> {
+ C() {
+ T v1;
+ }
+}
+''', (CompilationUnit u) {
+ var c = u.declarations[0] as ClassDeclaration;
+ cc = c.members[0] as ConstructorDeclaration;
+ return cc;
+ });
+
+ var ccb = cc.body as BlockFunctionBody;
+ var ccs = ccb.block.statements;
+
+ // The type of "v" is resolved.
+ {
+ var vd = ccs[0] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T');
+ }
+ }
+
+ void test_modeLocal_withContext_inClass_method() {
+ MethodDeclaration m;
+ _resolveTypeModeLocal(
+ r'''
+class C<T1> {
+ A m<T2>() {
+ T1 v1;
+ T2 v2;
+ }
+}
+''', (CompilationUnit u) {
+ var c = u.declarations[0] as ClassDeclaration;
+ m = c.members[0] as MethodDeclaration;
+ return m;
+ });
+
+ // The return type of "m" is not resolved.
+ expect(m.returnType.type, isNull);
+
+ var mb = m.body as BlockFunctionBody;
+ var ms = mb.block.statements;
+
+ // The type of "v1" is resolved.
+ {
+ var vd = ms[0] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T1');
+ }
+
+ // The type of "v2" is resolved.
+ {
+ var vd = ms[1] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T2');
+ }
+ }
+
+ void test_modeLocal_withContext_methodBody() {
+ expect(() {
+ _resolveTypeModeLocal(
+ r'''
+class C<T1> {
+ A m<T2>() {
+ T1 v1;
+ T2 v2;
+ }
+}
+''', (CompilationUnit u) {
+ var c = u.declarations[0] as ClassDeclaration;
+ var m = c.members[0] as MethodDeclaration;
+ var mb = m.body as BlockFunctionBody;
+ return mb;
+ });
+ }, throwsStateError);
+ }
+
+ void test_modeLocal_withContext_topLevelFunction() {
+ FunctionDeclaration f;
+ _resolveTypeModeLocal(
+ r'''
+A m<T>() {
+ T v;
+}
+''', (CompilationUnit u) {
+ f = u.declarations[0] as FunctionDeclaration;
+ return f;
+ });
+
+ // The return type of "f" is not resolved.
+ expect(f.returnType.type, isNull);
+
+ var fb = f.functionExpression.body as BlockFunctionBody;
+ var fs = fb.block.statements;
+
+ // The type of "v" is resolved.
+ var vd = fs[0] as VariableDeclarationStatement;
+ expect(vd.variables.type.type.toString(), 'T');
+ }
+
+ void test_modeLocal_withContext_topLevelVariable() {
+ TopLevelVariableDeclaration v;
+ _resolveTypeModeLocal(
+ r'''
+A v = new A();
+''', (CompilationUnit u) {
+ v = u.declarations[0] as TopLevelVariableDeclaration;
+ return v;
+ });
+
+ // The type of "v" is not resolved.
+ expect(v.variables.type.type, isNull);
+
+ // The type of "v" initializer is resolved.
+ var vi = v.variables.variables[0].initializer as InstanceCreationExpression;
+ expect(vi.constructorName.type.type.toString(), 'A');
+ }
+
void test_visitCatchClause_exception() {
// catch (e)
CatchClause clause = AstFactory.catchClause("e");
@@ -3413,6 +3549,48 @@ A get G => new A();
}
node.accept(_visitor);
}
+
+ /**
+ * Parse the given [code], build elements and resolve in the
+ * [TypeResolverMode.local] mode. The [code] is allowed to use only the type
+ * named `A`.
+ */
+ void _resolveTypeModeLocal(
+ String code, AstNode getNodeToResolve(CompilationUnit unit)) {
+ CompilationUnit unit =
+ ParserTestCase.parseCompilationUnit2(code, parseGenericMethods: true);
+ var unitElement = new CompilationUnitElementImpl('/test.dart');
+
+ // Build API elements.
+ {
+ var holder = new ElementHolder();
+ unit.accept(new ElementBuilder(holder, unitElement));
+ }
+
+ // Prepare for resolution.
+ LibraryScope libraryScope;
+ TypeResolverVisitor visitor;
+ {
+ MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+ InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
+ resourceProvider: resourceProvider);
+ var source = resourceProvider.getFile('/test.dart').createSource();
+ var libraryElement = new LibraryElementImpl.forNode(context, null)
+ ..definingCompilationUnit = unitElement;
+ libraryScope = new LibraryScope(libraryElement);
+ visitor = new TypeResolverVisitor(
+ libraryElement, source, _typeProvider, _listener,
+ nameScope: libraryScope, mode: TypeResolverMode.local);
+ }
+
+ // Define top-level types.
+ ClassElementImpl A = ElementFactory.classElement2('A');
+ libraryScope.define(A);
+
+ // Perform resolution.
+ AstNode nodeToResolve = getNodeToResolve(unit);
+ nodeToResolve.accept(visitor);
+ }
}
class _RootScope extends Scope {
« pkg/analyzer/lib/src/generated/resolver.dart ('K') | « pkg/analyzer/test/generated/parser_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698