Skip to content
This repository has been archived by the owner on Feb 22, 2018. It is now read-only.

fix circularity issue when inferring from overrides #48

Closed
sigmundch opened this issue Feb 13, 2015 · 4 comments
Closed

fix circularity issue when inferring from overrides #48

sigmundch opened this issue Feb 13, 2015 · 4 comments
Assignees

Comments

@sigmundch
Copy link
Contributor

When implementing inference on overriden methods and fields, I encountered a bug that only affects types with generics that are part of a library cycle.

The source of the problem is likely related to where in the pipeline we are running our inference. In particular, we do it right after the super classes have been resolved, and before our members are, however I'm not sure yet on why this is happening.

Here is an example flaky test that illustrates the problem. This test passes often, but sometimes fail with a null pointer exception:

 testChecker({
      '/a.dart': '''
          import 'main.dart';
        abstract class I<E> {
          A<E> m(a, String f(v, T e));
        }
      ''',
      '/main.dart': '''
          import 'a.dart';

        abstract class A<E> implements I<E> {
          const A();

          E value;
        }

        abstract class M {
          int y;
        }

        class B<E> extends A<E> implements M {
          const B();
          int get y => 0;

          m(a, f(v, T e)) {}
        }

        foo () {
          int y = /*severe:StaticTypeError*/new B<String>().m(null, null).value;
          String z = new B<String>().m(null, null).value;
        }
    '''
    }, inferFromOverrides: true);

When it fails, this is the exception we see:

Error while looking up m in I<E>:
 The null object does not have a method 'substitute2'.

NoSuchMethodError: method not found: 'substitute2'
Receiver: null
Arguments: [_List len:1, _List len:1]
#0      Object._noSuchMethod (dart:core-patch/object_patch.dart:42)
#1      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#2      MethodMember.from (package:ddc_analyzer/src/generated/element.dart:8225:29)
#3      InterfaceTypeImpl.getMethod (package:ddc_analyzer/src/generated/element.dart:6418:24)
#4      _memberTypeGetter.f (package:ddc/src/utils.dart:150:34)
#5      searchTypeFor.search (package:ddc/src/utils.dart:105:32)
#6      searchTypeFor.search (package:ddc/src/utils.dart:118:19)
#7      searchTypeFor.search (package:ddc/src/utils.dart:114:17)
#8      searchTypeFor (package:ddc/src/utils.dart:125:16)
#9      RestrictedTypeResolverVisitor.visitMethodDeclaration (package:ddc/src/checker/resolver.dart:229:31)
#10     MethodDeclaration.accept (package:ddc_analyzer/src/generated/ast.dart:12944:63)
#11     TypeResolverVisitor.visitClassMembersInScope (package:ddc_analyzer/src/generated/resolver.dart:13952:26)
#12     ScopedVisitor.visitClassDeclaration (package:ddc_analyzer/src/generated/resolver.dart:12308:35)
#13     TypeResolverVisitor.visitClassDeclaration (package:ddc_analyzer/src/generated/resolver.dart:13900:32)
#14     ClassDeclaration.accept (package:ddc_analyzer/src/generated/ast.dart:4555:62)
#15     NodeList.accept (package:ddc_analyzer/src/generated/ast.dart:13507:26)
#16     CompilationUnit.visitChildren (package:ddc_analyzer/src/generated/ast.dart:5261:27)
#17     UnifyingAstVisitor.visitNode (package:ddc_analyzer/src/generated/ast.dart:20715:23)
#18     UnifyingAstVisitor.visitCompilationUnit (package:ddc_analyzer/src/generated/ast.dart:20555:60)
#19     CompilationUnit.accept (package:ddc_analyzer/src/generated/ast.dart:5254:61)
#20     LibraryResolver._buildTypeHierarchies (package:ddc_analyzer/src/generated/resolver.dart:8314:40)
#21     LibraryResolver.resolveLibrary (package:ddc_analyzer/src/generated/resolver.dart:7955:26)
#22     ResolveDartLibraryTask.internalPerform (package:ddc_analyzer/src/generated/engine.dart:11138:29)
#23     AnalysisTask._safelyPerform (package:ddc_analyzer/src/generated/engine.dart:6814:22)
#24     AnalysisTask.perform (package:ddc_analyzer/src/generated/engine.dart:6793:21)
#25     AnalysisContextImpl._cacheDartResolutionData (package:ddc_analyzer/src/generated/engine.dart:2901:33)
#26     AnalysisContextImpl._getDartResolutionData (package:ddc_analyzer/src/generated/engine.dart:3676:33)
#27     AnalysisContextImpl._getDartResolutionData2 (package:ddc_analyzer/src/generated/engine.dart:3708:36)
#28     AnalysisContextImpl.resolveCompilationUnit2 (package:ddc_analyzer/src/generated/engine.dart:2566:30)
#29     compile (package:ddc/devc.dart:69:61)
#30     testChecker (package:ddc/src/testing.dart:66:24)
@sigmundch
Copy link
Contributor Author

The code for context is currently at:
https://chromereviews.googleplex.com/145247013/

@jmesserly
Copy link
Contributor

fixed a while ago, I presume by Super Siggi :)

@sigmundch
Copy link
Contributor Author

haha :)

Yeah the fix went in at 92e1373. According to this comment I probably intended to close this issue at the time :)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Development

No branches or pull requests

2 participants