@@ -32,9 +32,7 @@ import 'package:kernel/kernel.dart'
3232 DartType,
3333 DynamicType,
3434 Expression,
35- Extension,
3635 ExtensionType,
37- ExtensionTypeDeclaration,
3836 FunctionNode,
3937 InterfaceType,
4038 Library,
@@ -1959,19 +1957,21 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19591957
19601958 _ticker.logMs ("Loaded library $libraryUri " );
19611959
1960+ int ? offsetToUse;
19621961 Class ? cls;
19631962 if (className != null ) {
19641963 Builder ? scopeMember = libraryBuilder.libraryNameSpace
19651964 .lookup (className)
19661965 ? .getable;
19671966 if (scopeMember is ClassBuilder ) {
19681967 cls = scopeMember.cls;
1968+ offsetToUse = cls.fileOffset;
19691969 } else {
19701970 return null ;
19711971 }
19721972 }
1973- Extension ? extension ;
1974- ExtensionTypeDeclaration ? extensionType ;
1973+
1974+ bool isExtensionOrExtensionType = false ;
19751975 String ? extensionName;
19761976 if (usedMethodName != null ) {
19771977 int indexOfDot = usedMethodName.indexOf ("." );
@@ -1997,15 +1997,17 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19971997 }
19981998 extensionName = beforeDot;
19991999 if (builder is ExtensionBuilder ) {
2000- extension = builder.extension ;
2000+ isExtensionOrExtensionType = true ;
2001+ offsetToUse = builder.fileOffset;
20012002 Builder ? subBuilder = builder.lookupLocalMember (afterDot)? .getable;
20022003 if (subBuilder is MemberBuilder ) {
20032004 if (subBuilder.isExtensionInstanceMember) {
20042005 isStatic = false ;
20052006 }
20062007 }
20072008 } else if (builder is ExtensionTypeDeclarationBuilder ) {
2008- extensionType = builder.extensionTypeDeclaration;
2009+ isExtensionOrExtensionType = true ;
2010+ offsetToUse = builder.fileOffset;
20092011 Builder ? subBuilder = builder.lookupLocalMember (afterDot)? .getable;
20102012 if (subBuilder is MemberBuilder ) {
20112013 if (subBuilder.isExtensionTypeInstanceMember) {
@@ -2042,25 +2044,25 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
20422044 return null ;
20432045 }
20442046 }
2045- int index = 0 ;
20462047 for (String name in usedDefinitions.keys) {
2047- index++ ;
2048- if (! (isLegalIdentifier (name) ||
2049- ((extension != null || extensionType != null ) &&
2050- ! isStatic &&
2051- index == 1 &&
2052- isExtensionThisName (name)))) {
2053- lastGoodKernelTarget.loader.addProblem (
2054- codeIncrementalCompilerIllegalParameter.withArgumentsOld (name),
2055- // TODO: pass variable declarations instead of
2056- // parameter names for proper location detection.
2057- // https://github.com/dart-lang/sdk/issues/44158
2058- - 1 ,
2059- - 1 ,
2060- libraryUri,
2061- );
2062- return null ;
2048+ if (isLegalIdentifier (name)) continue ;
2049+ if (isExtensionThisName (name) &&
2050+ ! isStatic &&
2051+ isExtensionOrExtensionType) {
2052+ // Accept #this for extensions and extension types.
2053+ continue ;
20632054 }
2055+
2056+ lastGoodKernelTarget.loader.addProblem (
2057+ codeIncrementalCompilerIllegalParameter.withArgumentsOld (name),
2058+ // TODO: pass variable declarations instead of
2059+ // parameter names for proper location detection.
2060+ // https://github.com/dart-lang/sdk/issues/44158
2061+ - 1 ,
2062+ - 1 ,
2063+ libraryUri,
2064+ );
2065+ return null ;
20642066 }
20652067
20662068 // Setup scope first in two-step process:
@@ -2167,35 +2169,33 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
21672169 MemoryFileSystem fs = hfs.memory;
21682170 fs.entityForUri (debugExprUri).writeAsStringSync (expression);
21692171
2172+ VariableDeclaration ? extensionThis;
2173+
21702174 // TODO: pass variable declarations instead of
21712175 // parameter names for proper location detection.
21722176 // https://github.com/dart-lang/sdk/issues/44158
21732177 FunctionNode parameters = new FunctionNode (
21742178 null ,
21752179 typeParameters: typeDefinitions,
2176- positionalParameters: usedDefinitions.entries
2177- .map <VariableDeclaration >(
2178- (MapEntry <String , DartType > def) =>
2179- new VariableDeclarationImpl (def.key, type: def.value)
2180- ..fileOffset =
2181- cls? .fileOffset ??
2182- extension ? .fileOffset ??
2183- extensionType? .fileOffset ??
2184- libraryBuilder.library.fileOffset,
2185- )
2186- .toList (),
2180+ positionalParameters: usedDefinitions.entries.map <VariableDeclaration >((
2181+ MapEntry <String , DartType > def,
2182+ ) {
2183+ VariableDeclarationImpl variable = new VariableDeclarationImpl (
2184+ def.key,
2185+ type: def.value,
2186+ )..fileOffset = offsetToUse ?? libraryBuilder.library.fileOffset;
2187+
2188+ if (isExtensionOrExtensionType &&
2189+ ! isStatic &&
2190+ isExtensionThisName (def.key) &&
2191+ extensionThis == null ) {
2192+ // The `#this` variable is special.
2193+ extensionThis = variable..isLowered = true ;
2194+ }
2195+ return variable;
2196+ }).toList (),
21872197 );
21882198
2189- VariableDeclaration ? extensionThis;
2190- if ((extension != null || extensionType != null ) &&
2191- ! isStatic &&
2192- parameters.positionalParameters.isNotEmpty) {
2193- // We expect the first parameter to be called #this and be special.
2194- if (isExtensionThisName (parameters.positionalParameters.first.name)) {
2195- extensionThis = parameters.positionalParameters.first;
2196- extensionThis.isLowered = true ;
2197- }
2198- }
21992199 lastGoodKernelTarget.buildSyntheticLibrariesUntilBuildScopes ([
22002200 debugLibrary,
22012201 ]);
0 commit comments