blob: eae49b49d05a9fb901b32f6927bebcaf99914b4c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SpringSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Eisenberg - initial version
*******************************************************************************/
package org.eclipse.ajdt.core.tests.search;
import java.util.List;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.SearchMatch;
/**
* Test that types and annotations can be appropriately found inside of
* declare declarations
*
* @author Andrew Eisenberg
* @created Aug 18, 2010
*/
public class DeclareAwareSearchTests extends AbstractITDSearchTest {
public void testDeclareParentsExtends() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java extends Other;}\nclass Java { } \nclass Other{ }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Java");
IType superType = unit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsImplements() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java implements Other;}\nclass Java { } \ninterface Other{ }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Java");
IType superType = unit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsExtendsInSameAspect() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java extends Other;\nclass Java { } \nclass Other{ } }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Aspect").getType("Java");
IType superType = unit.getType("Aspect").getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsImplementsInSameAspect() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java implements Other;\nclass Java { } \ninterface Other{ } }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Aspect").getType("Java");
IType superType = unit.getType("Aspect").getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsExtendsInDifferentCU() throws Exception {
String contents = "package p;\nimport q.Java;\nimport r.Other;\naspect Aspect {\n declare parents : Java extends Other; }";
createCU("p", "Aspect.aj", contents);
ICompilationUnit javaUnit = createCU("q", "Java.java", "package q;\npublic class Java { }");
ICompilationUnit otherUnit = createCU("r", "Other.java", "package r;\npublic class Other { }");
IType subType = javaUnit.getType("Java");
IType superType = otherUnit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsImplementsInDifferentCU() throws Exception {
String contents = "package p;\nimport q.Java;\nimport r.Other;\naspect Aspect {\n declare parents : Java implements Other; }";
createCU("p", "Aspect.aj", contents);
ICompilationUnit javaUnit = createCU("q", "Java.java", "package q;\npublic class Java { }");
ICompilationUnit otherUnit = createCU("r", "Other.java", "package r;\npublic interface Other { }");
IType subType = javaUnit.getType("Java");
IType superType = otherUnit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testQualifiedDeclareParentsExtendsInDifferentCU() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : q.Java extends r.Other; }";
createCU("p", "Aspect.aj", contents);
ICompilationUnit javaUnit = createCU("q", "Java.java", "package q;\npublic class Java { }");
ICompilationUnit otherUnit = createCU("r", "Other.java", "package r;\npublic class Other { }");
IType subType = javaUnit.getType("Java");
IType superType = otherUnit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("q.Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("r.Other", contents, matches);
}
public void testQualifiedDeclareParentsImplementsInDifferentCU() throws Exception {
String contents = "package p;\nimport q.Java;\naspect Aspect {\n declare parents : q.Java implements r.Other; }";
createCU("p", "Aspect.aj", contents);
ICompilationUnit javaUnit = createCU("q", "Java.java", "package q;\npublic class Java { }");
ICompilationUnit otherUnit = createCU("r", "Other.java", "package r;\npublic interface Other { }");
IType subType = javaUnit.getType("Java");
IType superType = otherUnit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("q.Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("r.Other", contents, matches);
}
public void testDeclareParentsExtendsMultiple() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java || Second extends Other;}\nclass Java { } \nclass Second { } \nclass Other{ }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Java");
IType subType2 = unit.getType("Second");
IType superType = unit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(subType2, this.getName());
assertMatch("Second", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsExtendsPattern() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : Java+ extends Other;}\nclass Java { } \nclass Other{ }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Java");
IType superType = unit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testDeclareParentsExtendsAnnotationPattern() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : (@Ann *) extends Other;}\n @interface Ann { }\n@Ann class Java { } \nclass Other{ }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType subType = unit.getType("Ann");
IType superType = unit.getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertTwoMatches("Ann", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("Other", contents, matches);
}
public void testQualifiedDeclareParentsExtendsMultiple() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : q.Java || q.Second extends q.Other; }";
createCU("p", "Aspect.aj", contents);
IType subType = createCU("q", "Java.java", "package q;\npublic class Java { }").getType("Java");
IType subType2 = createCU("q", "Second.java", "package q;\npublic class Second { }").getType("Second");
IType superType = createCU("q", "Other.java", "package q;\npublic class Other { }").getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("q.Java", contents, matches);
matches = findSearchMatches(subType2, this.getName());
assertMatch("q.Second", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("q.Other", contents, matches);
}
public void testQualifiedDeclareParentsExtendsPattern() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : q.Java+ extends q.Other;}";
createCU("p", "Aspect.aj", contents);
IType subType = createCU("q", "Java.java", "package q;\npublic class Java { }").getType("Java");
IType superType = createCU("q", "Other.java", "package q;\npublic class Other { }").getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("q.Java", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("q.Other", contents, matches);
}
public void testQualifiedDeclareParentsExtendsAnnotationPattern() throws Exception {
String contents = "package p;\naspect Aspect {\n declare parents : (@q.Ann *) extends q.Other;}";
createCU("p", "Aspect.aj", contents);
createCU("q", "Java.java", "package q;\npublic class Java { }").getType("Java");
IType subType = createCU("q", "Ann.java", "package q;\n@interface Ann { }").getType("Ann");
IType superType = createCU("q", "Other.java", "package q;\npublic class Other { }").getType("Other");
List<SearchMatch> matches = findSearchMatches(subType, this.getName());
assertMatch("q.Ann", contents, matches);
matches = findSearchMatches(superType, this.getName());
assertMatch("q.Other", contents, matches);
}
// now look for declare annotation variations
public void testDeclareAtType() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @type : Java : @Ann; }\nclass Java { } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("Java", contents, matches);
}
public void testDeclareAtMethod() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @method : void Java.xxx() : @Ann; }\nclass Java {\n void xxx() { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("Java", contents, matches);
}
public void testDeclareAtConstructor() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @constructor : Java.new() : @Ann; }\nclass Java {\n Java() { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("Java", contents, matches);
}
public void testDeclareAtField() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @field : int Java.xxx : @Ann; }\nclass Java {\n int xxx; { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("Java", contents, matches);
}
public void testQualifiedDeclareAtType() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @type : p.Java : @p.Ann; }\nclass Java { } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("p.Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("p.Java", contents, matches);
}
public void testQualifiedDeclareAtMethod() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @method : void p.Java.xxx() : @p.Ann; }\nclass Java {\n void xxx() { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("p.Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("p.Java", contents, matches);
}
public void testQualifiedDeclareAtConstructor() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @constructor : p.Java.new() : @p.Ann; }\nclass Java {\n Java() { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("p.Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("p.Java", contents, matches);
}
public void testQualifiedDeclareAtField() throws Exception {
String contents = "package p;\naspect Aspect {\n declare @field : int p.Java.xxx : @p.Ann; }\nclass Java {\n int xxx; { } } \n @interface Ann { }";
ICompilationUnit unit = createCU("p", "Aspect.aj", contents);
IType ann = unit.getType("Ann");
IType type = unit.getType("Java");
List<SearchMatch> matches = findSearchMatches(ann, this.getName());
assertMatch("p.Ann", contents, matches);
matches = findSearchMatches(type, this.getName());
assertMatch("p.Java", contents, matches);
}
// Can't do patterns
}