JetPsiMatcher: reimplement using visitor, add structural type matching
This commit is contained in:
@@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.psi;
|
package org.jetbrains.jet.lang.psi;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class JetPsiMatcher {
|
public class JetPsiMatcher {
|
||||||
@@ -26,221 +30,219 @@ public class JetPsiMatcher {
|
|||||||
return (t1 == t2) || (t1 != null && t2 != null && t1.getText().equals(t2.getText()));
|
return (t1 == t2) || (t1 != null && t2 != null && t1.getText().equals(t2.getText()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean checkStringTemplateEntryMatch(JetStringTemplateEntry e1, JetStringTemplateEntry e2) {
|
private interface Predicate2<A, B> {
|
||||||
if (e1 == e2) return true;
|
boolean apply(A a, B b);
|
||||||
if (e1 == null || e2 == null) return false;
|
|
||||||
|
|
||||||
return e1.getClass() == e2.getClass() && checkExpressionMatch(e1.getExpression(), e2.getExpression());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean checkWhenConditionMatch(JetWhenCondition cond1, JetWhenCondition cond2) {
|
private static final Predicate2<JetElement, JetElement> DEFAULT_CHECKER = new Predicate2<JetElement, JetElement>() {
|
||||||
if (cond1 == cond2) return true;
|
@Override
|
||||||
if (cond1 == null || cond2 == null) return false;
|
public boolean apply(JetElement element1, JetElement element2) {
|
||||||
|
return checkElementMatch(element1, element2);
|
||||||
if (cond1.getClass() != cond2.getClass()) return false;
|
|
||||||
|
|
||||||
if (cond1 instanceof JetWhenConditionInRange) {
|
|
||||||
JetWhenConditionInRange inRange1 = (JetWhenConditionInRange) cond1;
|
|
||||||
JetWhenConditionInRange inRange2 = (JetWhenConditionInRange) cond2;
|
|
||||||
|
|
||||||
return inRange1.isNegated() == inRange2.isNegated() &&
|
|
||||||
checkExpressionMatch(inRange1.getRangeExpression(), inRange2.getRangeExpression()) &&
|
|
||||||
checkExpressionMatch(inRange1.getOperationReference(), inRange2.getOperationReference());
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (cond1 instanceof JetWhenConditionIsPattern) {
|
private static final Predicate2<ValueArgument, ValueArgument> VALUE_ARGUMENT_CHECKER = new Predicate2<ValueArgument, ValueArgument>() {
|
||||||
JetWhenConditionIsPattern pattern1 = (JetWhenConditionIsPattern) cond1;
|
@Override
|
||||||
JetWhenConditionIsPattern pattern2 = (JetWhenConditionIsPattern) cond2;
|
public boolean apply(ValueArgument a1, ValueArgument a2) {
|
||||||
|
if (a1 == a2) return true;
|
||||||
|
if (a1 == null || a2 == null) return false;
|
||||||
|
|
||||||
return pattern1.isNegated() == pattern2.isNegated() &&
|
if (a1.getClass() != a2.getClass()) return false;
|
||||||
checkTypeReferenceMatch(pattern1.getTypeRef(), pattern2.getTypeRef());
|
|
||||||
|
if (a1.isNamed() != a2.isNamed()) return false;
|
||||||
|
|
||||||
|
if (!checkElementMatch(a1.getArgumentExpression(), a2.getArgumentExpression())) return false;
|
||||||
|
|
||||||
|
if (a1.isNamed()) {
|
||||||
|
return checkElementMatch(a1.getArgumentName(), a2.getArgumentName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (cond1 instanceof JetWhenConditionWithExpression) {
|
private static <T> boolean checkListMatch(List<? extends T> list1, List<? extends T> list2, Predicate2<T, T> checker) {
|
||||||
return checkExpressionMatch(((JetWhenConditionWithExpression) cond1).getExpression(), ((JetWhenConditionWithExpression) cond2).getExpression());
|
int n = list1.size();
|
||||||
}
|
if (list2.size() != n) return false;
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean checkWhenEntryMatch(JetWhenEntry e1, JetWhenEntry e2) {
|
|
||||||
if (e1 == e2) return true;
|
|
||||||
if (e1 == null || e2 == null) return false;
|
|
||||||
|
|
||||||
if (!(e1.isElse() == e2.isElse() && checkExpressionMatch(e1.getExpression(), e2.getExpression()))) return false;
|
|
||||||
|
|
||||||
JetWhenCondition[] conditions1 = e1.getConditions();
|
|
||||||
JetWhenCondition[] conditions2 = e2.getConditions();
|
|
||||||
|
|
||||||
int n = conditions1.length;
|
|
||||||
if (conditions2.length != n) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (!checkWhenConditionMatch(conditions1[i], conditions2[i])) return false;
|
if (!checker.apply(list1.get(i), list2.get(i))) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean checkExpressionMatch(JetExpression e1, JetExpression e2) {
|
private static <T extends JetElement> boolean checkListMatch(List<? extends T> list1, List<? extends T> list2) {
|
||||||
if (e1 == e2) return true;
|
return checkListMatch(list1, list2, DEFAULT_CHECKER);
|
||||||
if (e1 == null || e2 == null) return false;
|
}
|
||||||
|
|
||||||
e1 = JetPsiUtil.deparenthesizeWithNoTypeResolution(e1);
|
private static final JetVisitor<Boolean, JetElement> VISITOR = new JetVisitor<Boolean, JetElement>() {
|
||||||
e2 = JetPsiUtil.deparenthesizeWithNoTypeResolution(e2);
|
@Override
|
||||||
|
public Boolean visitJetElement(JetElement element, JetElement data) {
|
||||||
assert e1 != null && e2 != null;
|
return false;
|
||||||
|
|
||||||
if (e1.getClass() != e2.getClass()) return false;
|
|
||||||
|
|
||||||
if (e1 instanceof JetArrayAccessExpression) {
|
|
||||||
JetArrayAccessExpression aae1 = (JetArrayAccessExpression) e1;
|
|
||||||
JetArrayAccessExpression aae2 = (JetArrayAccessExpression) e2;
|
|
||||||
|
|
||||||
if (!checkExpressionMatch(aae1.getArrayExpression(), aae2.getArrayExpression())) return false;
|
|
||||||
|
|
||||||
List<JetExpression> indexes1 = aae1.getIndexExpressions();
|
|
||||||
List<JetExpression> indexes2 = aae2.getIndexExpressions();
|
|
||||||
|
|
||||||
int n = indexes1.size();
|
|
||||||
if (indexes2.size() != n) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
if (!checkExpressionMatch(indexes1.get(i), indexes2.get(i))) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetBinaryExpression) {
|
@Override
|
||||||
JetBinaryExpression be1 = (JetBinaryExpression) e1;
|
public Boolean visitArrayAccessExpression(JetArrayAccessExpression aae1, JetElement data) {
|
||||||
JetBinaryExpression be2 = (JetBinaryExpression) e2;
|
JetArrayAccessExpression aae2 = (JetArrayAccessExpression) data;
|
||||||
|
|
||||||
|
return checkElementMatch(aae1.getArrayExpression(), aae2.getArrayExpression()) &&
|
||||||
|
checkListMatch(aae1.getIndexExpressions(), aae2.getIndexExpressions());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitBinaryExpression(JetBinaryExpression be1, JetElement data) {
|
||||||
|
JetBinaryExpression be2 = (JetBinaryExpression) data;
|
||||||
|
|
||||||
return be1.getOperationToken() == be2.getOperationToken() &&
|
return be1.getOperationToken() == be2.getOperationToken() &&
|
||||||
checkExpressionMatch(be1.getLeft(), be2.getLeft()) &&
|
checkElementMatch(be1.getLeft(), be2.getLeft()) &&
|
||||||
checkExpressionMatch(be1.getRight(), be2.getRight());
|
checkElementMatch(be1.getRight(), be2.getRight());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetBinaryExpressionWithTypeRHS) {
|
@Override
|
||||||
JetBinaryExpressionWithTypeRHS bet1 = (JetBinaryExpressionWithTypeRHS) e1;
|
public Boolean visitBinaryWithTypeRHSExpression(JetBinaryExpressionWithTypeRHS bet1, JetElement data) {
|
||||||
JetBinaryExpressionWithTypeRHS bet2 = (JetBinaryExpressionWithTypeRHS) e2;
|
JetBinaryExpressionWithTypeRHS bet2 = (JetBinaryExpressionWithTypeRHS) data;
|
||||||
|
|
||||||
return checkExpressionMatch(bet1.getLeft(), bet2.getLeft()) &&
|
return checkElementMatch(bet1.getLeft(), bet2.getLeft()) &&
|
||||||
checkTypeReferenceMatch(bet1.getRight(), bet2.getRight());
|
checkTypeReferenceMatch(bet1.getRight(), bet2.getRight());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetCallExpression) {
|
@Override
|
||||||
JetCallExpression call1 = (JetCallExpression) e1;
|
public Boolean visitCallExpression(JetCallExpression call1, JetElement data) {
|
||||||
JetCallExpression call2 = (JetCallExpression) e2;
|
JetCallExpression call2 = (JetCallExpression) data;
|
||||||
|
|
||||||
if (!checkExpressionMatch(call1.getCalleeExpression(), call2.getCalleeExpression())) return false;
|
if (!checkElementMatch(call1.getCalleeExpression(), call2.getCalleeExpression())) return false;
|
||||||
|
|
||||||
List<? extends ValueArgument> args1 = call1.getValueArguments();
|
return checkListMatch(call1.getValueArguments(), call2.getValueArguments(), VALUE_ARGUMENT_CHECKER) &&
|
||||||
List<? extends ValueArgument> args2 = call2.getValueArguments();
|
checkListMatch(call1.getFunctionLiteralArguments(), call2.getFunctionLiteralArguments());
|
||||||
|
|
||||||
int argCount = args1.size();
|
|
||||||
if (args2.size() != argCount) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < argCount; i++) {
|
|
||||||
if (!checkExpressionMatch(args1.get(i).getArgumentExpression(), args2.get(i).getArgumentExpression())) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<JetExpression> funLiterals1 = call1.getFunctionLiteralArguments();
|
|
||||||
List<JetExpression> funLiterals2 = call2.getFunctionLiteralArguments();
|
|
||||||
|
|
||||||
int funLiteralCount = funLiterals1.size();
|
|
||||||
if (funLiterals2.size() != funLiteralCount) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < argCount; i++) {
|
|
||||||
if (!checkExpressionMatch(funLiterals1.get(i), funLiterals2.get(i))) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetConstantExpression || e1 instanceof JetSimpleNameExpression) {
|
@Override
|
||||||
return e1.getText().equals(e2.getText());
|
public Boolean visitSimpleNameExpression(JetSimpleNameExpression expression, JetElement data) {
|
||||||
|
return expression.getText().equals(data.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetConstructorCalleeExpression) {
|
@Override
|
||||||
return checkTypeReferenceMatch(((JetConstructorCalleeExpression) e1).getTypeReference(), ((JetConstructorCalleeExpression) e2).getTypeReference());
|
public Boolean visitConstantExpression(JetConstantExpression expression, JetElement data) {
|
||||||
|
return expression.getText().equals(data.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetQualifiedExpression) {
|
@Override
|
||||||
return ((JetQualifiedExpression) e1).getOperationSign() == ((JetQualifiedExpression) e2).getOperationSign() &&
|
public Boolean visitIsExpression(JetIsExpression is1, JetElement data) {
|
||||||
checkExpressionMatch(((JetQualifiedExpression) e1).getReceiverExpression(), ((JetQualifiedExpression) e2).getReceiverExpression()) &&
|
JetIsExpression is2 = (JetIsExpression) data;
|
||||||
checkExpressionMatch(((JetQualifiedExpression) e1).getSelectorExpression(), ((JetQualifiedExpression) e2).getSelectorExpression());
|
|
||||||
|
return checkElementMatch(is1.getLeftHandSide(), is2.getLeftHandSide()) &&
|
||||||
|
checkTypeReferenceMatch(is1.getTypeRef(), is2.getTypeRef()) &&
|
||||||
|
is1.isNegated() == is2.isNegated();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetIfExpression) {
|
@Override
|
||||||
return checkExpressionMatch(((JetIfExpression) e1).getCondition(), ((JetIfExpression) e2).getCondition()) &&
|
public Boolean visitQualifiedExpression(JetQualifiedExpression qe1, JetElement data) {
|
||||||
checkExpressionMatch(((JetIfExpression) e1).getThen(), ((JetIfExpression) e2).getThen()) &&
|
JetQualifiedExpression qe2 = (JetQualifiedExpression) data;
|
||||||
checkExpressionMatch(((JetIfExpression) e1).getElse(), ((JetIfExpression) e2).getElse());
|
|
||||||
|
return qe1.getOperationSign() == qe2.getOperationSign() &&
|
||||||
|
checkElementMatch(qe1.getReceiverExpression(), qe2.getReceiverExpression()) &&
|
||||||
|
checkElementMatch(qe1.getSelectorExpression(), qe2.getSelectorExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetIsExpression) {
|
@Override
|
||||||
return checkExpressionMatch(((JetIsExpression) e1).getLeftHandSide(), ((JetIsExpression) e2).getLeftHandSide()) &&
|
public Boolean visitStringTemplateExpression(JetStringTemplateExpression expression, JetElement data) {
|
||||||
checkTypeReferenceMatch(((JetIsExpression) e1).getTypeRef(), ((JetIsExpression) e2).getTypeRef()) &&
|
return checkListMatch(
|
||||||
((JetIsExpression) e1).isNegated() == ((JetIsExpression) e2).isNegated();
|
Arrays.asList(expression.getEntries()),
|
||||||
|
Arrays.asList(((JetStringTemplateExpression) data).getEntries())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetStringTemplateExpression) {
|
@Override
|
||||||
JetStringTemplateExpression str1 = (JetStringTemplateExpression) e1;
|
public Boolean visitStringTemplateEntryWithExpression(JetStringTemplateEntryWithExpression entry, JetElement data) {
|
||||||
JetStringTemplateExpression str2 = (JetStringTemplateExpression) e2;
|
return checkElementMatch(entry.getExpression(), ((JetStringTemplateEntryWithExpression) data).getExpression());
|
||||||
|
|
||||||
JetStringTemplateEntry[] entries1 = str1.getEntries();
|
|
||||||
JetStringTemplateEntry[] entries2 = str2.getEntries();
|
|
||||||
|
|
||||||
int n = entries1.length;
|
|
||||||
if (entries2.length != n) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
if (!checkStringTemplateEntryMatch(entries1[i], entries2[i])) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetThrowExpression) {
|
@Override
|
||||||
return checkExpressionMatch(((JetThrowExpression) e1).getThrownExpression(), ((JetThrowExpression) e2).getThrownExpression());
|
public Boolean visitLiteralStringTemplateEntry(JetLiteralStringTemplateEntry entry, JetElement data) {
|
||||||
|
return entry.getText().equals(data.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetUnaryExpression) {
|
@Override
|
||||||
JetUnaryExpression ue1 = (JetUnaryExpression) e1;
|
public Boolean visitEscapeStringTemplateEntry(JetEscapeStringTemplateEntry entry, JetElement data) {
|
||||||
JetUnaryExpression ue2 = (JetUnaryExpression) e2;
|
return entry.getText().equals(data.getText());
|
||||||
|
|
||||||
return checkExpressionMatch(ue1.getBaseExpression(), ue2.getBaseExpression()) &&
|
|
||||||
checkExpressionMatch(ue1.getOperationReference(), ue2.getOperationReference());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e1 instanceof JetWhenExpression) {
|
@Override
|
||||||
JetWhenExpression when1 = (JetWhenExpression) e1;
|
public Boolean visitSuperExpression(JetSuperExpression super1, JetElement data) {
|
||||||
JetWhenExpression when2 = (JetWhenExpression) e2;
|
JetSuperExpression super2 = (JetSuperExpression) data;
|
||||||
|
|
||||||
if (checkExpressionMatch(when1.getSubjectExpression(), when2.getSubjectExpression())) return false;
|
|
||||||
|
|
||||||
List<JetWhenEntry> entries1 = when1.getEntries();
|
|
||||||
List<JetWhenEntry> entries2 = when2.getEntries();
|
|
||||||
|
|
||||||
int n = entries1.size();
|
|
||||||
if (entries2.size() != n) return false;
|
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
if (!checkWhenEntryMatch(entries1.get(i), entries2.get(i))) return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e1 instanceof JetThisExpression) return true;
|
|
||||||
|
|
||||||
if (e1 instanceof JetSuperExpression) {
|
|
||||||
JetSuperExpression super1 = (JetSuperExpression) e1;
|
|
||||||
JetSuperExpression super2 = (JetSuperExpression) e2;
|
|
||||||
|
|
||||||
return checkTypeReferenceMatch(super1.getSuperTypeQualifier(), super2.getSuperTypeQualifier()) &&
|
return checkTypeReferenceMatch(super1.getSuperTypeQualifier(), super2.getSuperTypeQualifier()) &&
|
||||||
checkExpressionMatch(super1.getInstanceReference(), super2.getInstanceReference()) &&
|
checkElementMatch(super1.getInstanceReference(), super2.getInstanceReference()) &&
|
||||||
checkExpressionMatch(super1.getTargetLabel(), super2.getTargetLabel());
|
checkElementMatch(super1.getTargetLabel(), super2.getTargetLabel());
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
@Override
|
||||||
|
public Boolean visitThrowExpression(JetThrowExpression expression, JetElement data) {
|
||||||
|
return checkElementMatch(expression.getThrownExpression(), ((JetThrowExpression) data).getThrownExpression());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitThisExpression(JetThisExpression this1, JetElement data) {
|
||||||
|
return checkElementMatch(this1.getTargetLabel(), ((JetThisExpression) data).getTargetLabel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitUnaryExpression(JetUnaryExpression ue1, JetElement data) {
|
||||||
|
JetUnaryExpression ue2 = (JetUnaryExpression) data;
|
||||||
|
|
||||||
|
return checkElementMatch(ue1.getBaseExpression(), ue2.getBaseExpression()) &&
|
||||||
|
checkElementMatch(ue1.getOperationReference(), ue2.getOperationReference());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitTypeReference(JetTypeReference typeReference, JetElement data) {
|
||||||
|
return checkElementMatch(typeReference.getTypeElement(), ((JetTypeReference) data).getTypeElement());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitFunctionType(JetFunctionType type1, JetElement data) {
|
||||||
|
JetFunctionType type2 = (JetFunctionType) data;
|
||||||
|
|
||||||
|
return checkListMatch(type1.getTypeArgumentsAsTypes(), type2.getTypeArgumentsAsTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitUserType(JetUserType type1, JetElement data) {
|
||||||
|
JetUserType type2 = (JetUserType) data;
|
||||||
|
|
||||||
|
return checkElementMatch(type1.getReferenceExpression(), type2.getReferenceExpression()) &&
|
||||||
|
checkElementMatch(type1.getQualifier(), type2.getQualifier()) &&
|
||||||
|
checkListMatch(type1.getTypeArgumentsAsTypes(), type2.getTypeArgumentsAsTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitSelfType(JetSelfType type, JetElement data) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean visitNullableType(JetNullableType nullableType, JetElement data) {
|
||||||
|
return checkElementMatch(nullableType.getInnerType(), ((JetNullableType) data).getInnerType());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static JetElement unwrap(JetElement e) {
|
||||||
|
if (e instanceof JetExpression) {
|
||||||
|
return JetPsiUtil.deparenthesizeWithNoTypeResolution((JetExpression) e);
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkElementMatch(@Nullable JetElement e1, @Nullable JetElement e2) {
|
||||||
|
e1 = unwrap(e1);
|
||||||
|
e2 = unwrap(e2);
|
||||||
|
|
||||||
|
if (e1 == e2) return true;
|
||||||
|
if (e1 == null || e2 == null) return false;
|
||||||
|
|
||||||
|
if (e1.getClass() != e2.getClass()) return false;
|
||||||
|
|
||||||
|
return e1.accept(VISITOR, e2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a[0]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
b[0]
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a[0]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[2]
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a[0]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[n]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[0]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[0]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[n]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a[n]
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
1 + 2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2 + 1
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
1 + 2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1 - 2
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a + 2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
b + 2
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a + b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
c/d
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a as String
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a !is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1 + 2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1 + 2
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a + b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a + b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a*10
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a*10
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a !is String
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a !is String
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
f()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f(0)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
f()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
g()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
f(a, b)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a.f(b)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
x.f(a, b)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
y.f(c, z)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f(a)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f(a)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f(a, 1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
f(a, 1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
x.f(a, 1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
x.f(a, 1)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
123
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
345
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
123
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
123
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
(a + b*x.f(n - 1))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(a + b)*x.f(n - 1)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
(a.foo((n + 2)*(m - 1))[k[i]] is MyClass?) || (b.foo(n - 2)[i + 1] !is YourClass)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a.foo((n + 2*m - 1))[k[i]] is MyClass? || b.foo[n - 2](i + 1) !is YourClass
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
a > b[n] && (a < foo(x.bar(n + 2)) || a == n) && b[n - 1] != foo(a + 2)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a > b[n] && a < foo(x.bar(n + 2)) || (a == n) && (b[n - 1] != foo(a + 2))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(a + b*x.f(n - 1))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(a) + b*x.f(n - 1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(a.foo((n + 2)*(m - 1))[k[i]] is MyClass?) || (b.foo(n - 2)[i + 1] !is YourClass)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a.foo((n + 2)*(m - 1))[k[i]] is MyClass? || b.foo(n - 2)[i + 1] !is YourClass
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a > b[n] && (a < foo(x.bar(n + 2)) || a == n) && b[n - 1] != foo(a + 2)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
a > b[n] && (a < foo(x.bar(n + 2)) || (a == n)) && (b[n - 1] != foo(a + 2))
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
test
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
abcd
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
test
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
test
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
super.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super.bar()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
super<String>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<Int>.foo()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
super<>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super.foo()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
super<A>@B.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<B>@A.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<Int>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<Int>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<>.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<Int>@label.foo()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
super<Int>@label.foo()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
throw X()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
throw Z()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
throw X()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
throw X()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
!false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!true
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
!a
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
++a
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
!a
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT_EQUAL
|
||||||
|
!x
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!a
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!a
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* 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.jet.lang.psi;
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.InTextDirectivesUtils;
|
||||||
|
import org.jetbrains.jet.JetLiteFixture;
|
||||||
|
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
|
||||||
|
import org.jetbrains.jet.config.CompilerConfiguration;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public abstract class AbstractJetPsiMatcherTest extends JetLiteFixture {
|
||||||
|
public void doTestExpressions(@NotNull String path) throws Exception {
|
||||||
|
String fileText = FileUtil.loadFile(new File(path));
|
||||||
|
String fileText2 = FileUtil.loadFile(new File(path + ".2"));
|
||||||
|
|
||||||
|
boolean equalityExpected = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// NOT_EQUAL") == null;
|
||||||
|
|
||||||
|
JetExpression expr = JetPsiFactory.createExpression(getProject(), fileText);
|
||||||
|
JetExpression expr2 = JetPsiFactory.createExpression(getProject(), fileText2);
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
"JetPsiMatcher.checkElementMatch() should return " + equalityExpected,
|
||||||
|
equalityExpected == JetPsiMatcher.checkElementMatch(expr, expr2)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected JetCoreEnvironment createEnvironment() {
|
||||||
|
return new JetCoreEnvironment(getTestRootDisposable(), new CompilerConfiguration());
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user