From 31934b950458d84a01d5e5e85eb054d2d3ba62a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Wa=C5=9Bko?= Date: Tue, 31 Dec 2024 19:57:18 +0100 Subject: [PATCH] finish implementing the logic in StaticModuleScopeAnalysis, start phasing out AtomTypeInterface --- .../pass/analyse/types/AtomTypeInterface.java | 1 + .../AtomTypeInterfaceFromBindingsMap.java | 11 +++----- .../types/TypeInferencePropagation.java | 9 +++++++ .../pass/analyse/types/TypePropagation.java | 1 + .../pass/analyse/types/TypeResolver.java | 3 +-- .../scope/StaticModuleScopeAnalysis.java | 25 +++++++++++++------ .../pass/analyse/BindingAnalysisTest.scala | 10 +++----- .../test/TypeMetadataPersistanceTest.java | 14 +---------- 8 files changed, 36 insertions(+), 38 deletions(-) diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterface.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterface.java index 8253650278c26..74864a19d708e 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterface.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterface.java @@ -8,6 +8,7 @@ *

This interface declares what methods can be called on instances of that type (or statically) * and what constructors may be called on it to create new instances. */ +@Deprecated interface AtomTypeInterface { List constructors(); diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterfaceFromBindingsMap.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterfaceFromBindingsMap.java index 56b88be3ec2a6..89311c136355c 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterfaceFromBindingsMap.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/AtomTypeInterfaceFromBindingsMap.java @@ -7,6 +7,7 @@ import scala.jdk.javaapi.CollectionConverters$; /** Implementation of {@link AtomTypeInterface} that is built from a {@link BindingsMap.Type}. */ +@Deprecated public final class AtomTypeInterfaceFromBindingsMap implements AtomTypeInterface { // TODO this probably is no longer needed since we have StaticModuleScope private final BindingsMap.Type type; @@ -38,8 +39,6 @@ public String name() { return constructor.name(); } - private transient List arguments = null; - @Override public List arguments() { return new ProxyList<>( @@ -65,14 +64,10 @@ public boolean hasDefaultValue() { return arg.hasDefaultValue(); } + @Deprecated @Override public TypeRepresentation getType(TypeResolver resolver) { - if (arg.typ().isEmpty()) { - return null; - } else { - Expression expression = arg.typ().get(); - return resolver.resolveTypeExpression(expression); - } + throw new IllegalStateException("No longer supported - this class will be removed soon."); } } } diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeInferencePropagation.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeInferencePropagation.java index 7205d2bd73cdb..8db4f6dcc7f76 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeInferencePropagation.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeInferencePropagation.java @@ -111,6 +111,15 @@ protected void encounteredNoSuchMethod( .getDiagnostics() .add(new Warning.NoSuchMethod(relatedIr.identifiedLocation(), methodDescription)); } + + @Override + protected void encounteredNoSuchConstructor(IR relatedIr, TypeRepresentation type, String constructorName) { + // TODO make sure if NoSuchMethod is right or we need a separate type here + String methodDescription = "constructor `" + constructorName + "` on type " + type; + relatedIr + .getDiagnostics() + .add(new Warning.NoSuchMethod(relatedIr.identifiedLocation(), methodDescription)); + } }; } diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypePropagation.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypePropagation.java index 27be474245032..8865d6af9e09f 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypePropagation.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypePropagation.java @@ -475,6 +475,7 @@ protected TypeRepresentation resolveGlobalName(BindingsMap.ResolvedName resolved return switch (resolvedName) { // TODO investigate when do these appear?? I did not yet see them in the wild case BindingsMap.ResolvedConstructor ctor -> { + // TODO can we replace this with querying StaticModuleScope? var constructorInterface = new AtomTypeInterfaceFromBindingsMap.ConstructorFromBindingsMap(ctor.cons()); yield typeResolver.buildAtomConstructorType( diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeResolver.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeResolver.java index bab17e22b4e45..caabaad1c5360 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeResolver.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/TypeResolver.java @@ -121,8 +121,7 @@ private TypeRepresentation getResolvedTypeFromBindingsMap(Name name) { } TypeRepresentation.TypeObject resolvedTypeAsTypeObject(BindingsMap.ResolvedType resolvedType) { - var iface = new AtomTypeInterfaceFromBindingsMap(resolvedType.tp()); - return new TypeRepresentation.TypeObject(resolvedType.qualifiedName(), iface); + return new TypeRepresentation.TypeObject(resolvedType.qualifiedName()); } TypeRepresentation resolvedTypeAsAtomType(BindingsMap.ResolvedType resolvedType) { diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/scope/StaticModuleScopeAnalysis.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/scope/StaticModuleScopeAnalysis.java index 102574403ba52..0321a2cce6478 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/scope/StaticModuleScopeAnalysis.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/types/scope/StaticModuleScopeAnalysis.java @@ -25,8 +25,10 @@ import org.enso.compiler.pass.resolve.FullyQualifiedNames$; import org.enso.compiler.pass.resolve.GlobalNames$; import org.enso.compiler.pass.resolve.TypeNames$; +import org.enso.pkg.QualifiedName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import scala.Option; import scala.collection.immutable.Seq; import scala.jdk.javaapi.CollectionConverters; import scala.jdk.javaapi.CollectionConverters$; @@ -136,24 +138,26 @@ protected void processMethodDefinition(Method.Explicit method) { @Override protected void processTypeDefinition(Definition.Type typ) { + QualifiedName qualifiedName = scopeBuilder.getModuleName().createChild(typ.name().name()); + TypeRepresentation.TypeObject typeObject = new TypeRepresentation.TypeObject(qualifiedName); List constructors = CollectionConverters$.MODULE$.asJava(typ.members()).stream() .map( constructorDef -> { - TypeRepresentation type = buildAtomConstructorType(constructorDef); + TypeRepresentation type = buildAtomConstructorType(typeObject, constructorDef); return new AtomType.Constructor( constructorDef.name().name(), constructorDef.isPrivate(), type); }) .toList(); AtomType atomType = new AtomType(typ.name().name(), constructors); - var qualifiedName = scopeBuilder.getModuleName().createChild(typ.name().name()); var atomTypeScope = TypeScopeReference.atomType(qualifiedName); scopeBuilder.registerType(atomType); registerFieldGetters(scopeBuilder, atomTypeScope, typ); } - private TypeRepresentation buildAtomConstructorType(Definition.Data constructorDef) { + private TypeRepresentation buildAtomConstructorType( + TypeRepresentation.TypeObject associatedType, Definition.Data constructorDef) { boolean hasDefaults = constructorDef.arguments().exists(a -> a.defaultValue().isDefined()); if (hasDefaults) { // TODO implement handling of default arguments - not only ctors will need this! @@ -165,13 +169,18 @@ private TypeRepresentation buildAtomConstructorType(Definition.Data constructorD .arguments() .map( (arg) -> { - var typ = arg.ascribedType(); - // TODO - return typ != null ? typ : TypeRepresentation.UNKNOWN; + Option typ = arg.ascribedType(); + if (typ.isEmpty()) { + return TypeRepresentation.UNKNOWN; + } + + var resolvedType = typeResolver.resolveTypeExpression(typ.get()); + assert resolvedType != null; + return resolvedType; }) .toList(); - var resultType = parentType.instanceType(); - return TypeRepresentation.buildFunction(arguments, resultType); + var resultType = associatedType.instanceType(); + return TypeRepresentation.buildFunction(CollectionConverters.asJava(arguments), resultType); } @Override diff --git a/engine/runtime-integration-tests/src/test/scala/org/enso/compiler/test/pass/analyse/BindingAnalysisTest.scala b/engine/runtime-integration-tests/src/test/scala/org/enso/compiler/test/pass/analyse/BindingAnalysisTest.scala index 8342d7245f75b..439ebfb6bca46 100644 --- a/engine/runtime-integration-tests/src/test/scala/org/enso/compiler/test/pass/analyse/BindingAnalysisTest.scala +++ b/engine/runtime-integration-tests/src/test/scala/org/enso/compiler/test/pass/analyse/BindingAnalysisTest.scala @@ -18,7 +18,6 @@ import org.enso.compiler.data.BindingsMap.{ import org.enso.compiler.pass.analyse.BindingAnalysis import org.enso.compiler.pass.{PassConfiguration, PassGroup, PassManager} import org.enso.compiler.test.CompilerTest -import org.enso.persist.Persistance class BindingAnalysisTest extends CompilerTest { @@ -168,18 +167,15 @@ class BindingAnalysisTest extends CompilerTest { List( Argument( "a", - hasDefaultValue = false, - Persistance.Reference.none() + hasDefaultValue = false ), Argument( "b", - hasDefaultValue = false, - Persistance.Reference.none() + hasDefaultValue = false ), Argument( "c", - hasDefaultValue = false, - Persistance.Reference.none() + hasDefaultValue = false ) ), isProjectPrivate = false diff --git a/engine/runtime/src/test/java/org/enso/runtime/test/TypeMetadataPersistanceTest.java b/engine/runtime/src/test/java/org/enso/runtime/test/TypeMetadataPersistanceTest.java index 4665bfdfc5d76..5502ee6bbc508 100644 --- a/engine/runtime/src/test/java/org/enso/runtime/test/TypeMetadataPersistanceTest.java +++ b/engine/runtime/src/test/java/org/enso/runtime/test/TypeMetadataPersistanceTest.java @@ -4,8 +4,6 @@ import java.io.IOException; import java.util.List; -import org.enso.compiler.data.BindingsMap; -import org.enso.compiler.pass.analyse.types.AtomTypeInterfaceFromBindingsMap; import org.enso.compiler.pass.analyse.types.InferredType; import org.enso.compiler.pass.analyse.types.TypeRepresentation; import org.enso.persist.Persistance; @@ -42,16 +40,6 @@ public void writeSomeInferredType() throws Exception { private TypeRepresentation.TypeObject mockObject() { var fqn = new QualifiedName(makeScalaList(List.of("mod")), "Test"); - return new TypeRepresentation.TypeObject(fqn, mockAtomType()); - } - - private AtomTypeInterfaceFromBindingsMap mockAtomType() { - scala.collection.immutable.List params = makeScalaList(List.of()); - var ctorArgs = - makeScalaList( - List.of(new BindingsMap.Argument("arg", false, Persistance.Reference.none()))); - var constructors = makeScalaList(List.of(new BindingsMap.Cons("ctor", ctorArgs, false))); - return new AtomTypeInterfaceFromBindingsMap( - new BindingsMap.Type("Test", params, constructors, false)); + return new TypeRepresentation.TypeObject(fqn); } }