Skip to content

Commit

Permalink
Extract type from Vector Text
Browse files Browse the repository at this point in the history
  • Loading branch information
JaroslavTulach committed Jan 17, 2025
1 parent 124f415 commit b065fe0
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import org.enso.compiler.core.IR;
import org.enso.compiler.core.ir.DefinitionArgument;
import org.enso.compiler.core.ir.Expression;
import org.enso.compiler.core.ir.Function.Lambda;
import org.enso.compiler.core.ir.expression.Application;
import org.enso.compiler.core.ir.module.scope.Definition;
import org.enso.compiler.core.ir.module.scope.definition.Method;
import org.enso.compiler.data.BindingsMap;
Expand Down Expand Up @@ -61,15 +63,39 @@ static String toSignature(DefinitionArgument a) {
return sb.toString();
}

private static QualifiedName extractTypeOrNull(IR ir) {
private static String extractTypeOrNull(IR ir) {
var meta = ir.passData().get(TypeSignatures$.MODULE$);
if (meta.isDefined()) {
var sig = (TypeSignatures.Signature) meta.get();
var typeNameOpt = sig.signature().passData().get(TypeNames$.MODULE$);
if (typeNameOpt.isDefined()) {
var typeName = (BindingsMap.Resolution) typeNameOpt.get();
return typeName.target().qualifiedName();
var sigMeta = (TypeSignatures.Signature) meta.get();
var sigFqn = extractFqnOrNull(sigMeta.signature());
if (sigFqn != null) {
return sigFqn.toString();
}
if (sigMeta.signature() instanceof Application.Prefix app) {
var typeConstructor = extractFqnOrNull(app.function()).toString();
if (typeConstructor != null) {
var sb = new StringBuilder();
sb.append("(");
sb.append(typeConstructor);
for (var a : asJava(app.arguments())) {
var fqn = extractFqnOrNull(a.value());
assert fqn != null : "No FQN for " + a;
sb.append(" ");
sb.append(fqn);
}
sb.append(")");
return sb.toString();
}
}
}
return null;
}

private static QualifiedName extractFqnOrNull(Expression ir) {
var typeNameOpt = ir.passData().get(TypeNames$.MODULE$);
if (typeNameOpt.isDefined()) {
var typeName = (BindingsMap.Resolution) typeNameOpt.get();
return typeName.target().qualifiedName();
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,33 @@ public void privateAreHidden() throws Exception {
assertEquals("No constructors", 0, v.visitConstructor.size());
}

@Test
public void vectorWithElements() throws Exception {
var code =
"""
from Standard.Base import Vector, Text
values a:Text -> Vector Text = [a]
""";

var v = new MockVisitor();
generateDocumentation("VectorText", code, v);

assertEquals("One methods", 1, v.visitMethod.size());
assertEquals("No constructors", 0, v.visitConstructor.size());

var p = v.visitMethod.get(0);
assertNull("It is a module method", p.t());

var m = p.ir();
assertEquals("values", m.methodName().name());
assertEquals(
"Generates vector with argument type as return type",
"values a:Standard.Base.Data.Text.Text -> (Standard.Base.Data.Vector.Vector"
+ " Standard.Base.Data.Text.Text)",
DocsVisit.toSignature(m));
}

private static void generateDocumentation(String name, String code, DocsVisit v)
throws IOException {
var pathCalc = TEMP.newFolder(name);
Expand Down

0 comments on commit b065fe0

Please sign in to comment.