@@ -11,7 +11,15 @@ import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
11
11
12
12
import 'package:front_end/src/api_prototype/experimental_flags.dart' ;
13
13
import 'package:front_end/src/api_prototype/front_end.dart' ;
14
+
15
+ import 'package:front_end/src/api_prototype/lowering_predicates.dart'
16
+ show isExtensionThisName;
17
+
14
18
import 'package:front_end/src/base/nnbd_mode.dart' ;
19
+
20
+ import 'package:front_end/src/fasta/builder/member_builder.dart'
21
+ show MemberBuilder;
22
+
15
23
import 'package:front_end/src/fasta/fasta_codes.dart' ;
16
24
import 'package:front_end/src/fasta/source/source_loader.dart' ;
17
25
import 'package:kernel/binary/ast_from_binary.dart'
@@ -34,6 +42,7 @@ import 'package:kernel/kernel.dart'
34
42
Component,
35
43
DartType,
36
44
Expression,
45
+ Extension,
37
46
FunctionNode,
38
47
Library,
39
48
LibraryDependency,
@@ -48,7 +57,8 @@ import 'package:kernel/kernel.dart'
48
57
Source,
49
58
Supertype,
50
59
TreeNode,
51
- TypeParameter;
60
+ TypeParameter,
61
+ VariableDeclaration;
52
62
53
63
import 'package:kernel/canonical_name.dart'
54
64
show CanonicalNameError, CanonicalNameSdkError;
@@ -71,6 +81,8 @@ import 'builder/builder.dart' show Builder;
71
81
72
82
import 'builder/class_builder.dart' show ClassBuilder;
73
83
84
+ import 'builder/extension_builder.dart' show ExtensionBuilder;
85
+
74
86
import 'builder/field_builder.dart' show FieldBuilder;
75
87
76
88
import 'builder/library_builder.dart' show LibraryBuilder;
@@ -1907,8 +1919,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
1907
1919
List <TypeParameter > typeDefinitions,
1908
1920
String syntheticProcedureName,
1909
1921
Uri libraryUri,
1910
- [String ? className,
1911
- bool isStatic = false ]) async {
1922
+ {String ? className,
1923
+ String ? methodName,
1924
+ bool isStatic = false }) async {
1912
1925
assert (dillLoadedData != null && userCode != null );
1913
1926
1914
1927
return await context.runInContext ((_) async {
@@ -1923,6 +1936,26 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
1923
1936
cls = classBuilder? .cls;
1924
1937
if (cls == null ) return null ;
1925
1938
}
1939
+ Extension ? extension ;
1940
+ String ? extensionName;
1941
+ if (methodName != null ) {
1942
+ int indexOfDot = methodName.indexOf ("." );
1943
+ if (indexOfDot >= 0 ) {
1944
+ String beforeDot = methodName.substring (0 , indexOfDot);
1945
+ String afterDot = methodName.substring (indexOfDot + 1 );
1946
+ Builder ? builder = libraryBuilder.scopeBuilder[beforeDot];
1947
+ extensionName = beforeDot;
1948
+ if (builder is ExtensionBuilder ) {
1949
+ extension = builder.extension ;
1950
+ Builder ? subBuilder = builder.scopeBuilder[afterDot];
1951
+ if (subBuilder is MemberBuilder ) {
1952
+ if (subBuilder.isExtensionInstanceMember) {
1953
+ isStatic = false ;
1954
+ }
1955
+ }
1956
+ }
1957
+ }
1958
+ }
1926
1959
1927
1960
userCode! .loader.resetSeenMessages ();
1928
1961
@@ -1937,8 +1970,14 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
1937
1970
return null ;
1938
1971
}
1939
1972
}
1973
+ int index = 0 ;
1940
1974
for (String name in definitions.keys) {
1941
- if (! isLegalIdentifier (name)) {
1975
+ index++ ;
1976
+ if (! (isLegalIdentifier (name) ||
1977
+ (extension != null &&
1978
+ ! isStatic &&
1979
+ index == 1 &&
1980
+ isExtensionThisName (name)))) {
1942
1981
userCode! .loader.addProblem (
1943
1982
templateIncrementalCompilerIllegalParameter.withArguments (name),
1944
1983
// TODO: pass variable declarations instead of
@@ -2009,13 +2048,29 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
2009
2048
positionalParameters: definitions.keys
2010
2049
.map ((name) =>
2011
2050
new VariableDeclarationImpl (name, 0 , type: definitions[name])
2012
- ..fileOffset =
2013
- cls? .fileOffset ?? libraryBuilder.library.fileOffset)
2051
+ ..fileOffset = cls? .fileOffset ??
2052
+ extension ? .fileOffset ??
2053
+ libraryBuilder.library.fileOffset)
2014
2054
.toList ());
2015
2055
2056
+ VariableDeclaration ? extensionThis;
2057
+ if (extension != null &&
2058
+ ! isStatic &&
2059
+ parameters.positionalParameters.isNotEmpty) {
2060
+ // We expect the first parameter to be called #this and be special.
2061
+ if (isExtensionThisName (parameters.positionalParameters.first.name)) {
2062
+ extensionThis = parameters.positionalParameters.first;
2063
+ extensionThis.isLowered = true ;
2064
+ }
2065
+ }
2066
+
2016
2067
debugLibrary.build (userCode! .loader.coreLibrary, modifyTarget: false );
2017
2068
Expression compiledExpression = await userCode! .loader.buildExpression (
2018
- debugLibrary, className, className != null && ! isStatic, parameters);
2069
+ debugLibrary,
2070
+ className ?? extensionName,
2071
+ (className != null && ! isStatic) || extensionThis != null ,
2072
+ parameters,
2073
+ extensionThis);
2019
2074
2020
2075
Procedure procedure = new Procedure (
2021
2076
new Name (syntheticProcedureName), ProcedureKind .Method , parameters,
@@ -2026,7 +2081,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
2026
2081
..parent = parameters;
2027
2082
2028
2083
procedure.fileUri = debugLibrary.fileUri;
2029
- procedure.parent = className != null ? cls : libraryBuilder.library;
2084
+ procedure.parent = cls ?? libraryBuilder.library;
2030
2085
2031
2086
userCode! .uriToSource.remove (debugExprUri);
2032
2087
userCode! .loader.sourceBytes.remove (debugExprUri);
0 commit comments