blob: 1cafc1fe88760ca64ea1bd9e0f84b939ea6d27a6 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.android.inspections.lint;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import lombok.ast.CompilationUnit;
import lombok.ast.TypeDeclaration;
import org.jetbrains.android.AndroidTestCase;
import static com.android.tools.lint.client.api.JavaParser.*;
public class LombokPsiParserTest extends AndroidTestCase {
public void testResolve() {
String source1Path = "src/p1/p2/Target.java";
String source1 = "package p1.p2;\n" +
"\n" +
"public class Target {\n" +
" public void foo(int f) {\n" +
" }\n" +
" public int myField = 5;\n" +
" public static class Target2 extends java.io.File {\n" +
" public Target2() {\n" +
" super(null, null);\n" +
" }\n" +
" }\n" +
"}";
myFixture.addFileToProject(source1Path, source1);
String source2Path = "src/p1/p2/Caller.java";
String source2 = "package p1.p2;\n" +
"\n" +
"public final class Caller extends Target.Target2 {\n" +
" public String call(Target target) {\n" +
" target.foo(42);\n" +
" target.myField = 6;\n" +
" }\n" +
"}";
PsiFile file2 = myFixture.addFileToProject(source2Path, source2);
PsiCall call = PsiTreeUtil.findChildrenOfType(file2, PsiCall.class).iterator().next();
ResolvedNode resolved = LombokPsiParser.resolve(call);
assertNotNull(resolved);
assertTrue(resolved instanceof ResolvedMethod);
ResolvedMethod method = (ResolvedMethod)resolved;
assertEquals("foo", method.getName());
assertEquals("p1.p2.Target", method.getContainingClass().getName());
assertTrue(method.isInPackage("p1.p2", true));
assertTrue(method.isInPackage("p1.p2", false));
assertTrue(method.isInPackage("p1", true));
assertFalse(method.isInPackage("p1", false));
// Resolve "target" as a reference expression in the call() method
PsiElement element = ((PsiMethodCallExpression)call).getMethodExpression().getQualifier();
assertNotNull(element);
resolved = LombokPsiParser.resolve(element);
assertTrue(resolved instanceof ResolvedVariable);
ResolvedVariable resolvedVariable = (ResolvedVariable)resolved;
assertEquals("target", resolvedVariable.getName());
assertEquals("p1.p2.Target", resolvedVariable.getType().getName());
PsiMethod callMethod = PsiTreeUtil.findChildrenOfType(file2, PsiMethod.class).iterator().next();
assertNotNull(callMethod);
PsiVariable variable = callMethod.getParameterList().getParameters()[0];
resolved = LombokPsiParser.resolve(variable);
assertTrue(resolved instanceof ResolvedVariable);
resolvedVariable = (ResolvedVariable)resolved;
assertEquals("target", resolvedVariable.getName());
assertEquals("p1.p2.Target", resolvedVariable.getType().getName());
@SuppressWarnings("ConstantConditions")
PsiStatement fieldReferenceStatement = callMethod.getBody().getStatements()[1];
PsiExpression lExpression =
((PsiAssignmentExpression)((PsiExpressionStatement)fieldReferenceStatement).getExpression()).getLExpression();
resolved = LombokPsiParser.resolve(lExpression);
assertTrue(resolved instanceof ResolvedField);
ResolvedField field = (ResolvedField)resolved;
assertEquals("myField", field.getName());
assertEquals("int", field.getType().getName());
assertEquals("p1.p2.Target", field.getContainingClass().getName());
assertTrue(field.isInPackage("p1.p2", true));
assertTrue(field.isInPackage("p1.p2", false));
assertTrue(field.isInPackage("p1", true));
assertFalse(field.isInPackage("p1", false));
PsiClass cls = PsiTreeUtil.findChildrenOfType(file2, PsiClass.class).iterator().next();
@SuppressWarnings("ConstantConditions")
PsiJavaCodeReferenceElement superReference = cls.getExtendsList().getReferenceElements()[0];
resolved = LombokPsiParser.resolve(superReference);
assertTrue(resolved instanceof ResolvedClass);
ResolvedClass rc = (ResolvedClass)resolved;
assertTrue(rc.getName().equals("p1.p2.Target.Target2"));
assertTrue(rc.isInPackage("p1.p2", true));
assertTrue(rc.isInPackage("p1.p2", false));
assertTrue(rc.isInPackage("p1", true));
assertFalse(rc.isInPackage("p1", false));
CompilationUnit unit = LombokPsiConverter.convert((PsiJavaFile)file2);
//noinspection ConstantConditions
TypeDeclaration first = unit.astTypeDeclarations().first();
resolved = LombokPsiParser.resolve((PsiElement)first.getNativeNode());
assertTrue(resolved instanceof ResolvedClass);
rc = (ResolvedClass)resolved;
assertEquals("p1.p2.Caller", rc.getName());
//noinspection ConstantConditions
assertEquals("p1.p2.Target.Target2", rc.getSuperClass().getName());
assertNull(rc.getContainingClass());
}
}