@@ -216,10 +216,33 @@ class SourceExtensionTypeDeclarationBuilder
216216 typeBuilder.declaration is TypeAliasBuilder
217217 ? typeBuilder.declaration as TypeAliasBuilder
218218 : null ;
219+
219220 DartType interface = typeBuilder.build (
220221 libraryBuilder, TypeUse .extensionTypeImplementsType);
221- Message ? errorMessage;
222- List <LocatedMessage >? errorContext;
222+
223+ TypeDeclarationBuilder ? implementedDeclaration =
224+ typeBuilder.computeUnaliasedDeclaration (isUsedAsClass: false );
225+ if (LibraryBuilder .isFunction (implementedDeclaration, coreLibrary) ||
226+ LibraryBuilder .isRecord (implementedDeclaration, coreLibrary)) {
227+ Message ? errorMessage;
228+ List <LocatedMessage >? errorContext;
229+ if (aliasBuilder != null ) {
230+ // Coverage-ignore-block(suite): Not run.
231+ errorMessage = templateSuperExtensionTypeIsIllegalAliased
232+ .withArguments (typeBuilder.fullNameForErrors, interface );
233+ errorContext = [
234+ messageTypedefCause.withLocation (
235+ aliasBuilder.fileUri, aliasBuilder.fileOffset, noLength),
236+ ];
237+ } else {
238+ errorMessage = templateSuperExtensionTypeIsIllegal
239+ .withArguments (typeBuilder.fullNameForErrors);
240+ }
241+ libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
242+ noLength, typeBuilder.fileUri,
243+ context: errorContext);
244+ continue ;
245+ }
223246
224247 if (typeParameters? .isNotEmpty ?? false ) {
225248 for (NominalParameterBuilder variable in typeParameters! ) {
@@ -228,6 +251,7 @@ class SourceExtensionTypeDeclarationBuilder
228251 sourceLoader: libraryBuilder.loader)
229252 .variance! ;
230253 if (! variance.greaterThanOrEqual (variable.variance)) {
254+ Message ? errorMessage;
231255 if (variable.parameter.isLegacyCovariant) {
232256 errorMessage =
233257 templateWrongTypeParameterVarianceInSuperinterface
@@ -239,31 +263,33 @@ class SourceExtensionTypeDeclarationBuilder
239263 .withArguments (variable.variance.keyword, variable.name,
240264 variance.keyword, typeBuilder.typeName! .name);
241265 }
266+ libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
267+ noLength, typeBuilder.fileUri);
242268 }
243269 }
244- if (errorMessage != null ) {
245- libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
246- noLength, typeBuilder.fileUri,
247- context: errorContext);
248- errorMessage = null ;
249- }
250270 }
251271
252272 if (interface is ExtensionType ) {
253273 if (interface .nullability == Nullability .nullable) {
254- errorMessage = templateSuperExtensionTypeIsNullableAliased
274+ Message ? errorMessage = templateSuperExtensionTypeIsNullableAliased
255275 .withArguments (typeBuilder.fullNameForErrors, interface );
276+ List <LocatedMessage >? errorContext;
256277 if (aliasBuilder != null ) {
257278 errorContext = [
258279 messageTypedefCause.withLocation (
259280 aliasBuilder.fileUri, aliasBuilder.fileOffset, noLength),
260281 ];
261282 }
283+ libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
284+ noLength, typeBuilder.fileUri,
285+ context: errorContext);
262286 } else {
263287 extensionTypeDeclaration.implements .add (interface );
264288 }
265289 } else if (interface is InterfaceType ) {
266290 if (interface .isPotentiallyNullable) {
291+ Message ? errorMessage;
292+ List <LocatedMessage >? errorContext;
267293 if (typeBuilder.nullabilityBuilder.isNullable) {
268294 errorMessage = templateNullableInterfaceError
269295 .withArguments (typeBuilder.fullNameForErrors);
@@ -277,37 +303,29 @@ class SourceExtensionTypeDeclarationBuilder
277303 ];
278304 }
279305 }
306+ libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
307+ noLength, typeBuilder.fileUri,
308+ context: errorContext);
280309 } else {
281- Class cls = interface .classNode;
282- if (LibraryBuilder .isFunction (cls, coreLibrary) ||
283- LibraryBuilder .isRecord (cls, coreLibrary)) {
284- if (aliasBuilder != null ) {
285- // Coverage-ignore-block(suite): Not run.
286- errorMessage = templateSuperExtensionTypeIsIllegalAliased
287- .withArguments (typeBuilder.fullNameForErrors, interface );
288- errorContext = [
289- messageTypedefCause.withLocation (
290- aliasBuilder.fileUri, aliasBuilder.fileOffset, noLength),
291- ];
292- } else {
293- errorMessage = templateSuperExtensionTypeIsIllegal
294- .withArguments (typeBuilder.fullNameForErrors);
295- }
296- } else {
297- extensionTypeDeclaration.implements .add (interface );
298- }
310+ extensionTypeDeclaration.implements .add (interface );
299311 }
300312 } else if (interface is TypeParameterType ) {
301- errorMessage = templateSuperExtensionTypeIsTypeParameter
313+ Message ? errorMessage = templateSuperExtensionTypeIsTypeParameter
302314 .withArguments (typeBuilder.fullNameForErrors);
315+ List <LocatedMessage >? errorContext;
303316 if (aliasBuilder != null ) {
304317 // Coverage-ignore-block(suite): Not run.
305318 errorContext = [
306319 messageTypedefCause.withLocation (
307320 aliasBuilder.fileUri, aliasBuilder.fileOffset, noLength),
308321 ];
309322 }
323+ libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
324+ noLength, typeBuilder.fileUri,
325+ context: errorContext);
310326 } else {
327+ Message ? errorMessage;
328+ List <LocatedMessage >? errorContext;
311329 if (aliasBuilder != null ) {
312330 errorMessage = templateSuperExtensionTypeIsIllegalAliased
313331 .withArguments (typeBuilder.fullNameForErrors, interface );
@@ -319,8 +337,6 @@ class SourceExtensionTypeDeclarationBuilder
319337 errorMessage = templateSuperExtensionTypeIsIllegal
320338 .withArguments (typeBuilder.fullNameForErrors);
321339 }
322- }
323- if (errorMessage != null ) {
324340 libraryBuilder.addProblem (errorMessage, typeBuilder.charOffset! ,
325341 noLength, typeBuilder.fileUri,
326342 context: errorContext);
0 commit comments