Skip to content

Commit

Permalink
Make a simple "var" inferrer.
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Feb 14, 2018
1 parent 05933cf commit 6d59e30
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 5 deletions.
Expand Up @@ -50,8 +50,9 @@
import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration; import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration;


/** /**
* The declaration of a variable.<br/>In <code>int x = 14, y = 3;</code> "x = 14" and " y = 3" are * The declaration of a variable.<br/>In <code>int x = 14, y = 3;</code> "int x = 14" and "int y = 3" are
* VariableDeclarators. * VariableDeclarators.
* <p/>The type is on all of the variable declarators because, thanks to array brackets, each variable can have a different type.
* *
* @author Julio Vilmar Gesser * @author Julio Vilmar Gesser
*/ */
Expand Down
Expand Up @@ -31,6 +31,7 @@
import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.metamodel.VoidTypeMetaModel; import com.github.javaparser.metamodel.VoidTypeMetaModel;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.resolution.types.ResolvedVoidType; import com.github.javaparser.resolution.types.ResolvedVoidType;
import javax.annotation.Generated; import javax.annotation.Generated;
import java.util.Optional; import java.util.Optional;
Expand Down Expand Up @@ -92,8 +93,8 @@ public boolean replace(Node node, Node replacementNode) {
} }


@Override @Override
public ResolvedVoidType resolve() { public ResolvedType resolve() {
return getSymbolResolver().toResolvedType(this, ResolvedVoidType.class); return getSymbolResolver().toResolvedType(this, ResolvedType.class);
} }


@Override @Override
Expand Down
Expand Up @@ -473,6 +473,9 @@ protected ResolvedType convertToUsage(com.github.javaparser.ast.type.Type type,
} else if (type instanceof UnionType) { } else if (type instanceof UnionType) {
UnionType unionType = (UnionType) type; UnionType unionType = (UnionType) type;
return new ResolvedUnionType(unionType.getElements().stream().map(el -> convertToUsage(el, context)).collect(Collectors.toList())); return new ResolvedUnionType(unionType.getElements().stream().map(el -> convertToUsage(el, context)).collect(Collectors.toList()));
} else if (type instanceof VarType) {
final VariableDeclarator variableDeclarator = (VariableDeclarator)type.getParentNode().get();
return variableDeclarator.getInitializer().get().calculateResolvedType();
} else { } else {
throw new UnsupportedOperationException(type.getClass().getCanonicalName()); throw new UnsupportedOperationException(type.getClass().getCanonicalName());
} }
Expand Down
Expand Up @@ -47,7 +47,7 @@ public class ReferenceTypeImpl extends ResolvedReferenceType {


public static ResolvedReferenceType undeterminedParameters(ResolvedReferenceTypeDeclaration typeDeclaration, TypeSolver typeSolver) { public static ResolvedReferenceType undeterminedParameters(ResolvedReferenceTypeDeclaration typeDeclaration, TypeSolver typeSolver) {
return new ReferenceTypeImpl(typeDeclaration, typeDeclaration.getTypeParameters().stream().map( return new ReferenceTypeImpl(typeDeclaration, typeDeclaration.getTypeParameters().stream().map(
tp -> new ResolvedTypeVariable(tp) ResolvedTypeVariable::new
).collect(Collectors.toList()), typeSolver); ).collect(Collectors.toList()), typeSolver);
} }


Expand Down
Expand Up @@ -15,7 +15,7 @@


public class ConvertToUsageTest extends AbstractResolutionTest { public class ConvertToUsageTest extends AbstractResolutionTest {


TypeSolver typeSolver = new ReflectionTypeSolver(); private final TypeSolver typeSolver = new ReflectionTypeSolver();


@Test @Test
public void testConvertTypeToUsage() { public void testConvertTypeToUsage() {
Expand Down
@@ -0,0 +1,46 @@
package com.github.javaparser.symbolsolver.resolution.javaparser;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseStart;
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.type.VarType;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import org.junit.Test;

import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_10_PREVIEW;
import static com.github.javaparser.Providers.provider;
import static org.junit.Assert.assertEquals;

public class VarTypeTest {
private final TypeSolver typeSolver = new ReflectionTypeSolver();
private final JavaParser javaParser = new JavaParser(new ParserConfiguration()
.setLanguageLevel(JAVA_10_PREVIEW)
.setSymbolResolver(new JavaSymbolSolver(typeSolver)));

@Test
public void resolveAPrimitive() {
CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{var abc = 1;}")).getResult().get();
VarType varType = ast.findFirst(VarType.class).get();

ResolvedType resolvedType = varType.resolve();

assertEquals(ResolvedPrimitiveType.byName("int"), resolvedType);
}

@Test
public void resolveAReferenceType() {
CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{var abc = \"\";}")).getResult().get();
VarType varType = ast.findFirst(VarType.class).get();

ResolvedType resolvedType = varType.resolve();

assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver), resolvedType);
}
}

0 comments on commit 6d59e30

Please sign in to comment.