package com.intellij.flex.resolver;
import com.intellij.flex.util.FlexTestUtils;
import com.intellij.lang.javascript.BaseJSResolveTestCase;
import com.intellij.lang.javascript.JSTestOption;
import com.intellij.lang.javascript.JSTestOptions;
import com.intellij.lang.javascript.psi.JSFunction;
import com.intellij.lang.javascript.psi.JSLocalVariable;
import com.intellij.lang.javascript.psi.JSNamedElement;
import com.intellij.lang.javascript.psi.JSReferenceExpression;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveResult;
import com.intellij.util.Processor;
public class ActionScriptResolveTest extends BaseJSResolveTestCase {
@Override
protected String getExtension() {
return "as";
}
@Override
protected String getSampleName() {
return "__sample.as";
}
@Override
protected String getTestDataPath() {
return FlexTestUtils.getTestDataPath("resolve/");
}
private static void checkResolvedToClass(final ResolveResult[] resolveResults) {
assertEquals(1, resolveResults.length);
final PsiElement realElement = getElement(resolveResults[0]);
assertTrue(realElement instanceof JSClass);
assertEquals("B", ((JSClass)realElement).getName());
}
private static Processor<ResolveResult[]> createProcessor(final String expected) {
return resolveResults -> {
assertEquals(1, resolveResults.length);
PsiElement element = getElement(resolveResults[0]);
assertTrue(element instanceof JSClass);
assertEquals(expected, ((JSNamedElement)element).getName());
return false;
};
}
public void testResolveInClassDynamic() throws Exception {
String fileText = "public class T {\n" +
" public function m() : String {\n" +
" return \"m\";\n" +
" }\n" +
"\n" +
" public function test() : String {\n" +
" function foo():String {\n" +
" return this.<ref>m();\n" +
" }\n" +
" return foo();\n" +
" }\n" +
"}\n" +
"function m() {}";
JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.js2");
ResolveResult[] results = ref.multiResolve(false);
assertEquals(2, results.length);
}
public void testResolveIt() throws Exception {
String fileText = "package {\n" +
"\n" +
"public class Test {\n" +
" public function Test() {\n" +
" var describeType:XML = describe<ref>Type(Test);\n" +
" }\n" +
"}\n" +
"function describeType(x) {}";
JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.js2");
assertTrue(ref.resolve() instanceof JSLocalVariable);
}
public void testResolveInClass() throws Exception {
String fileText = "class A { function get aaa() {} function foo() {\n" +
" var aaa = a<ref>aa;\n}" +
"}";
JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.js2");
assertTrue(ref.resolve() instanceof JSFunction);
}
public void testObjectProperties() throws Exception {
String fileText = "package {\n" +
"public class Foo {\n" +
" function bar() {" +
" var x:Object = {};\n" +
" x.toStri<ref>ng();\n" +
" }\n" +
"}\n" +
"}";
JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.as");
final PsiElement resolved = ref.resolve();
assertNotNull(resolved);
}
public void testResolveOfGetProperty() throws Exception {
String fileText = "class A { public function get foo() : String { return \"foo\"; } }\n" +
"function zzz() {\n" +
"var a : A;\n" +
"a.f<ref>oo" +
"}";
PsiReference ref = configureByFileText(fileText, "sample.js2");
PsiElement resolved = ref.resolve();
assertTrue(resolved instanceof JSFunction);
}
public void testResolve23_4() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_5() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("C", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_6() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("C", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_7() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("E", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_8() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_9() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), getTestName(false) + ".as");
}
public void testResolve23_10() throws Exception {
final String testName = getTestName(false);
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), testName + ".as", testName + "_2.as", testName + "_3.as");
}
public void testResolve23_11() throws Exception {
doMultipleResolveTestForFile(resolveResults -> {
checkResolvedToClass(resolveResults);
return false;
}, getTestName(false) + ".as");
}
public void testResolve23_12() throws Exception {
doMultipleResolveTestForFile(resolveResults -> {
checkResolvedToClass(resolveResults);
return false;
}, getTestName(false) + ".as");
}
public void testResolve24() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), getTestName(false) + ".as");
}
public void testResolve24_2() throws Exception {
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), getTestName(false) + ".as");
}
public void testResolve24_3() throws Exception {
final String testName = getTestName(false);
doMultipleResolveTestForFile(buildResolveHandler("A", JSClass.class), testName + ".as", testName + "_2.as");
doMultipleResolveTestForFile(buildResolveHandler("AAA", JSClass.class), testName + "_3.as");
doMultipleResolveTestForFile(buildResolveHandler("BBB", JSClass.class), testName + "_4.as", testName + "_5.as");
doMultipleResolveTestForFile(buildResolveHandler("foo.XXX", JSClass.class, false, true), testName + "_7.as");
doMultipleResolveTestForFile(buildResolveHandler("foo2.ZZZ", JSClass.class, false, true), testName + "_8.as");
doMultipleResolveTestForFile(buildResolveHandler("CCC", JSClass.class), testName + "_6.as");
doMultipleResolveTestForFile(buildResolveHandler("foo.CCC", JSClass.class, false, true), testName + "_9.as");
}
//public void testResolve24_4() throws Exception {
// final String testName = getTestName(false);
// doMultipleResolveTestForFile(buildResolveHandler("Object", JSClass.class), testName +".as");
//}
//public void testResolve24_5() throws Exception {
// final String testName = getTestName(false);
// doMultipleResolveTestForFile(buildResolveHandler("Object", JSClass.class), testName +".as");
//}
public void testResolve24_6() throws Exception {
final String testName = getTestName(false);
doMultipleResolveTestForFile(buildResolveHandler("ResolveTest", JSFunction.class), testName + ".as");
doMultipleResolveTestForFile(buildResolveHandler("ResolveTest3", JSFunction.class), testName + "_4.as");
doMultipleResolveTestForFile(buildResolveHandler("ResolveTest5", JSClass.class), testName + "_5.as");
doMultipleResolveTestForFile(buildResolveHandler("ResolveTest2", JSFunction.class), testName + "_2.as", testName + "_3.as");
doMultipleResolveTestForFile(buildResolveHandler("ResolveTest4", JSClass.class), testName + "_4_2.as");
}
public void testResolve24_7() throws Exception {
final String testName = getTestName(false);
doMultipleResolveTestForFile(createProcessor("BazBar"), testName + ".as");
doMultipleResolveTestForFile(createProcessor("BazBar2"), testName + "_2.as", testName + "_3.as");
}
@JSTestOptions({JSTestOption.WithIndex})
public void testResolve26() throws Exception {
String fileText = "dynamic class Object {}\n" +
"package {\n" +
"\timport flash.display.Sprite;\n" +
"\tpublic class DoubleInterfaceResolve extends Sprite {\n" +
"\t}\n" +
"}\n" +
"import flash.display.Sprite;\n" +
"class FooView extends Sprite {\n" +
"}\n" +
"\n" +
"interface ItfA {\n" +
" function f():It<ref>fB;\n" +
"}\n" +
"interface ItfB {}";
PsiReference ref = configureByFileText(fileText, "sample.js2");
PsiElement resolved = ref.resolve();
assertTrue(resolved instanceof JSClass);
}
public void testResolveVectorMember() throws Exception {
String fileText = "package {\n" +
"public class Vector$object {\n" +
" function reverse():Vector$object {}\n" +
"}\n" +
"}\n" +
"var x:Vector.<int>\n" +
"x.rev<ref>erse()";
JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.as");
final PsiElement resolved = ref.resolve();
assertNotNull(resolved);
}
}