diff options
author | Daan Schipper <daancschipper@gmail.com> | 2018-02-19 14:24:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-19 14:24:52 +0100 |
commit | 1d50f775a6e319f8f6f8f10655c0c4dd5eea6aff (patch) | |
tree | 0d5678f5ae0f6ec2c3d87bd95eba6a33ce32011a | |
parent | 6b3efb4c278d57bef7034bf37ccd90803015e01e (diff) | |
parent | fbd8c73b0a66f3d71cd073c7b2cb61a1112f7ba6 (diff) | |
download | javaparser-1d50f775a6e319f8f6f8f10655c0c4dd5eea6aff.tar.gz |
Merge branch 'master' into master
6 files changed, 78 insertions, 5 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/body/VariableDeclarator.java b/javaparser-core/src/main/java/com/github/javaparser/ast/body/VariableDeclarator.java index de728cdc3..0d342ac58 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/body/VariableDeclarator.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/body/VariableDeclarator.java @@ -50,8 +50,9 @@ import com.github.javaparser.resolution.Resolvable; 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. + * <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 */ diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java b/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java index 0d6296655..3755c2fb8 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java @@ -31,6 +31,7 @@ import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.VoidTypeMetaModel; +import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedVoidType; import javax.annotation.Generated; import java.util.Optional; @@ -92,8 +93,8 @@ public final class VarType extends Type { } @Override - public ResolvedVoidType resolve() { - return getSymbolResolver().toResolvedType(this, ResolvedVoidType.class); + public ResolvedType resolve() { + return getSymbolResolver().toResolvedType(this, ResolvedType.class); } @Override diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java index 4a4783dd4..f73dd986c 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java @@ -473,6 +473,15 @@ public class JavaParserFacade { } else if (type instanceof UnionType) { UnionType unionType = (UnionType) type; return new ResolvedUnionType(unionType.getElements().stream().map(el -> convertToUsage(el, context)).collect(Collectors.toList())); + } else if (type instanceof VarType) { + Node parent = type.getParentNode().get(); + if (!(parent instanceof VariableDeclarator)) { + throw new IllegalStateException("Trying to resolve a `var` which is not in a variable declaration."); + } + final VariableDeclarator variableDeclarator = (VariableDeclarator) parent; + return variableDeclarator.getInitializer() + .map(Expression::calculateResolvedType) + .orElseThrow(() -> new IllegalStateException("Cannot resolve `var` which has no initializer.")); } else { throw new UnsupportedOperationException(type.getClass().getCanonicalName()); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl.java index 8397a6702..927253e24 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl.java @@ -47,7 +47,7 @@ public class ReferenceTypeImpl extends ResolvedReferenceType { public static ResolvedReferenceType undeterminedParameters(ResolvedReferenceTypeDeclaration typeDeclaration, TypeSolver typeSolver) { return new ReferenceTypeImpl(typeDeclaration, typeDeclaration.getTypeParameters().stream().map( - tp -> new ResolvedTypeVariable(tp) + ResolvedTypeVariable::new ).collect(Collectors.toList()), typeSolver); } diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java index 67828d018..44eda270e 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.*; public class ConvertToUsageTest extends AbstractResolutionTest { - TypeSolver typeSolver = new ReflectionTypeSolver(); + private final TypeSolver typeSolver = new ReflectionTypeSolver(); @Test public void testConvertTypeToUsage() { diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java new file mode 100644 index 000000000..3444ba2b1 --- /dev/null +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java @@ -0,0 +1,62 @@ +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.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); + } + + @Test(expected = IllegalStateException.class) + public void failResolveNoInitializer() { + CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{var abc;}")).getResult().get(); + VarType varType = ast.findFirst(VarType.class).get(); + + varType.resolve(); + } + + @Test(expected = IllegalStateException.class) + public void failResolveWrongLocation() { + CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{void x(var x){};}")).getResult().get(); + VarType varType = ast.findFirst(VarType.class).get(); + + varType.resolve(); + } +} |