aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaan Schipper <daancschipper@gmail.com>2018-02-19 14:24:52 +0100
committerGitHub <noreply@github.com>2018-02-19 14:24:52 +0100
commit1d50f775a6e319f8f6f8f10655c0c4dd5eea6aff (patch)
tree0d5678f5ae0f6ec2c3d87bd95eba6a33ce32011a
parent6b3efb4c278d57bef7034bf37ccd90803015e01e (diff)
parentfbd8c73b0a66f3d71cd073c7b2cb61a1112f7ba6 (diff)
downloadjavaparser-1d50f775a6e319f8f6f8f10655c0c4dd5eea6aff.tar.gz
Merge branch 'master' into master
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/ast/body/VariableDeclarator.java3
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java5
-rw-r--r--javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade.java9
-rw-r--r--javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl.java2
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java2
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java62
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();
+ }
+}