blob: 5339a995de1100fb33854fb516afee7e3c3e2f67 [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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 com.google.dart.engine.services.completion;
/**
* Short, specific code completion tests.
*/
public class CompletionTests extends CompletionTestCase {
public void fail_test034() throws Exception {
// TODO(scheglov) decide what to do with Type for untyped field (not supported by the new store)
// test analysis of untyped fields and top-level vars
test(
src(
"var topvar;",
"class Top {top(){}}",
"class Left extends Top {left(){}}",
"class Right extends Top {right(){}}",
"t1() {",
" topvar = new Left();",
"}",
"t2() {",
" topvar = new Right();",
"}",
"class A {",
" var field;",
" a() {",
" field = new Left();",
" }",
" b() {",
" field = new Right();",
" }",
" test() {",
" topvar.!1top();",
" field.!2top();",
" }",
"}"),
"1+top",
"2+top");
}
public void fail_test036() throws Exception {
// TODO(scheglov) decide what to do with Type for untyped field (not supported by the new store)
// test analysis of untyped fields and top-level vars
test(
src(
"class A1 {",
" var field;",
" A1() : field = 0;",
" q() {",
" A1 a = new A1();",
" a.field.!1",
" }",
"}",
"main() {",
" A1 a = new A1();",
" a.field.!2",
"}"),
"1+round",
"2+round");
}
public void test_classMembers_inGetter() throws Exception {
test("class A { var fff; get z {ff!1}}", "1+fff");
}
public void test001() throws Exception {
String source = src(//
"void r1(var v) {",
" v.!1toString!2().!3hash!4Code",
"}");
test(
source,
"1+toString",
"1-==",
"2+toString",
"3+hashCode",
"3+toString",
"4+hashCode",
"4-toString");
}
public void test002() throws Exception {
String source = src(//
"void r2(var vim) {",
" v!1.toString()",
"}");
test(source, "1+vim");
}
public void test003() throws Exception {
String source = src(//
"class A {",
" int a() => 3;",
" int b() => this.!1a();",
"}");
test(source, "1+a");
}
public void test004() throws Exception {
String source = src(//
"class A {",
" int x;",
" A() : this.!1x = 1;",
" A.b() : this();",
" A.c() : this.!2b();",
" g() => new A.!3c();",
"}");
test(source, "1+x", "2+b", "3+c");
}
public void test005() throws Exception {
String source = src(//
"class A {}",
"void rr(var vim) {",
" var !1vq = v!2.toString();",
" var vf;",
" v!3.toString();",
"}");
test(
source,
"1-A",
"1-vim",
"1+vq",
"1-vf",
"1-this",
"1-void",
"1-null",
"1-false",
"2-A",
"2+vim",
"2-vf",
"2-vq",
"2-this",
"2-void",
"2-null",
"2-false",
"3+vf",
"3+vq",
"3+vim",
"3-A");
}
public void test006() throws Exception {
String source = src(//
"void r2(var vim, {va: 2, b: 3}) {",
" v!1.toString()",
"}");
test(source, "1+va", "1-b");
}
public void test007() throws Exception {
String source = src(//
"void r2(var vim, [va: 2, b: 3]) {",
" v!1.toString()",
"}");
test(source, "1+va", "1-b");
}
public void test008() throws Exception {
// keywords
String source = src(//
"!1class Aclass {}",
"class Bclass !2extends!3 !4Aclass {}",
"!5typedef Ctype = !6Bclass with !7Aclass;",
"class Dclass extends !8Ctype {}",
"!9abstract class Eclass implements Dclass,!C Ctype, Bclass {}",
"class Fclass extends Bclass !Awith !B Eclass {}");
test(
source,
"1+class",
"1-implements",
"1-extends",
"1-with",
"2+extends",
"3+extends",
"4+Aclass",
"4-Bclass",
"5+typedef",
"6+Bclass",
"6-Ctype",
"7+Aclass",
"7-Bclass",
"8+Ctype",
"9+abstract",
"A+with",
"B+Eclass",
"B-Dclass",
"B-Ctype",
"C+Bclass",
"C-Eclass");
}
public void test009() throws Exception {
// keywords
String source = src(//
"class num{}",
"typedef !1dy!2namic TestFn1();",
"typedef !3vo!4id TestFn2();",
"typ!7edef !5n!6");
test(
source,
"1+void",
"1+TestFn2",
"2+dynamic",
"2-void",
"3+dynamic",
"4+void",
"4-dynamic",
"5+TestFn2",
"6+num",
"7+typedef");
}
public void test010() throws Exception {
String source = src(//
"class String{}class List{}",
"class test !8<!1t !2 !3extends String,!4 List,!5 !6>!7 {}",
"class tezetst !9<!BString,!C !DList>!A {}");
test(
source,
"1+String",
"1+List",
"1-test",
"2-String",
"2-test",
"3+extends",
"4+tezetst",
"4-test",
"5+String",
"6+List",
"7-List",
"8-List",
"9-String",
"A-String",
"B+String",
"C+List",
"C-tezetst",
"D+List",
"D+test");
}
public void test011() throws Exception {
// name generation with conflicts
test("r2(var object, Object object1, Object !1);", "1+object2");
}
public void test012() throws Exception {
// reserved words
test(src(//
"class X {",
"f() {",
" g(!1var!2 z) {!3true.!4toString();};",
" }",
"}"), "1+var", "1+dynamic", "1-f", "2+var", "2-dynamic", "3+false", "3+true", "4+toString");
}
public void test013() throws Exception {
// conditions & operators
test(src(//
"class Q {",
" bool x;",
" List zs;",
" int k;",
" var a;",
" mth() {",
" while (!1x !9); ",
" do{} while(!2x !8);",
" for(z in !3zs) {}",
" switch(!4k) {case 1:{!0}}",
" try {",
" } on !5Object catch(a){}",
" if (!7x !6) {} else {};",
" }",
"}"), "1+x", "2+x", "3+zs", "4+k", "5+Q", "5-a", "6+==", "7+x", "8+==", "9+==", "0+k");
}
public void test014() throws Exception {
// keywords
test(
src(//
"class Q {",
" bool x;",
" List zs;",
" int k;",
" !Dvar a;",
" !Evoid mth() {",
" !1while (z) { !Gcontinue; }; ",
" !2do{ !Hbreak; } !3while(x);",
" !4for(z !5in zs) {}",
" !6for (int i; i < 3; i++);",
" !7switch(k) {!8case 1:{} !9default:{}}",
" !Atry {",
" } !Bon Object !Ccatch(a){}",
" !Fassert true;",
" !Jif (x) {} !Kelse {};",
" !Lreturn;",
" }",
"}"),
"1+while",
"2+do",
"3+while",
"4+for",
"5+in",
"6+for",
"7+switch",
"8+case",
"9+default",
"A+try",
"B+on",
"C+catch",
"D+var",
"E+void",
"F+assert",
"G+continue",
"H+break",
"J+if",
"K+else",
"L+return");
}
public void test015() throws Exception {
// operators in function
test("f(a,b,c) => a + b * c !1;", "1+==");
}
public void test016() throws Exception {
// operators in return
test("class X {dynamic f(a,b,c) {return a + b * c !1;}}", "1+==");
}
public void test017() throws Exception {
// keywords
test(
src(//
"!1library foo;",
"!2import 'x' !5as r;",
"!3export '!8uri' !6hide Q !7show X;",
"!4part 'x';"),
"1+library",
"2+import",
"3+export",
"4+part",
"5+as",
"6+hide",
"7+show",
"8-null");
}
public void test018() throws Exception {
// keywords
test("!1part !2of foo;", "1+part", "2+of");
}
public void test019() throws Exception {
test(src(//
"var truefalse = 0;",
"var falsetrue = 1;",
"main() {",
" var foo = true!1",
"}"), "1+true", "1+truefalse", "1-falsetrue");
}
public void test020() throws Exception {
test("var x = null.!1", "1+toString");
}
public void test021() throws Exception {
test("var x = .!1", "1-toString");
}
public void test022() throws Exception {
test("var x = .!1;", "1-toString");
}
public void test023() throws Exception {
test(//
src(//
"class Map{getKeys(){}}",
"class X {",
" static x1(Map m) {",
" m.!1getKeys;",
" }",
" x2(Map m) {",
" m.!2getKeys;",
" }",
"}"),
"1+getKeys",
"2+getKeys");
}
public void test024() throws Exception {
test(//
src(// Note lack of semicolon following completion location
"class List{factory List.from(Iterable other) {}}",
"class F {",
" f() {",
" new List.!1",
" }",
"}"),
"1+from");
}
public void test025() throws Exception {
test(
src(
"class R {",
" static R _m;",
" static R m;",
" f() {",
" var a = !1m;",
" var b = _!2m;",
" var c = !3g();",
" }",
" static g() {",
" var a = !4m;",
" var b = _!5m;",
" var c = !6g();",
" }",
"}",
"class T {",
" f() {",
" R x;",
" x.!7g();",
" x.!8m;",
" x._!9m;",
" }",
" static g() {",
" var q = R._!Am;",
" var g = R.!Bm;",
" var h = R.!Cg();",
" }",
" h() {",
" var q = R._!Dm;",
" var g = R.!Em;",
" var h = R.!Fg();",
" }",
"}"),
"1+m",
"2+_m",
"3+g",
"4+m",
"5+_m",
"6+g",
"7-g",
"8-m",
"9-_m",
"A+_m",
"B+m",
"C+g",
"D+_m",
"E+m",
"F+g");
}
public void test026() throws Exception {
test("var aBcD; var x=ab!1", "1+aBcD");
}
public void test027() throws Exception {
test("m(){try{}catch(eeee,ssss){s!1}", "1+ssss");
}
public void test028() throws Exception {
test("m(){var isX=3;if(is!1)", "1+isX");
}
public void test029() throws Exception {
test("m(){[1].forEach((x)=>!1x);}", "1+x");
}
public void test030() throws Exception {
test("n(){[1].forEach((x){!1});}", "1+x");
}
public void test031() throws Exception {
test(
"class Caster {} m() {try {} on Cas!1ter catch (CastBlock) {!2}}",
"1+Caster",
"1-CastBlock",
"2+Caster",
"2+CastBlock");
}
public void test032() throws Exception {
test(
src(
"const ONE = 1;",
"const ICHI = 10;",
"const UKSI = 100;",
"const EIN = 1000;",
"m() {",
" int x;",
" switch (x) {",
" case !3ICHI:",
" case UKSI:",
" case EIN!2:",
" case ONE!1: return;",
" default: return;",
" }",
"}"),
"1+ONE",
"1-UKSI",
"2+EIN",
"2-ICHI",
"3+ICHI",
"3+UKSI",
"3+EIN",
"3+ONE");
}
public void test033() throws Exception {
test(
"class A{}class B extends A{b(){}}class C implements A {c(){}}class X{x(){A f;f.!1}}",
"1+b",
"1-c");
}
public void test035() throws Exception {
// test analysis of untyped fields and top-level vars
test("class Y {final x='hi';mth() {x.!1length;}}", "1+length");
}
public void test037() throws Exception {
test(src(//
"class HttpServer{}",
"class HttpClient{}",
"main() {",
" new HtS!1",
"}"), "1+HttpServer", "1-HttpClient");
}
public void test038() throws Exception {
test(src(//
"class X {",
" x(){}",
"}",
"class Y {",
" y(){}",
"}",
"class A<Z extends X> {",
" Y ay;",
" Z az;",
" A(this.ay, this.az) {",
" ay.!1y;",
" az.!2x;",
" }",
"}"), "1+y", "1-x", "2+x", "2-y");
}
public void test039() throws Exception {
// test analysis of untyped fields and top-level vars
test("class X{}var x = null as !1X;", "1+X", "1-void");
}
public void test040() throws Exception {
// test arg lists with named params
test("m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1)!2;}", "1+x1", "2-x2");
}
public void test041() throws Exception {
// test arg lists with named params
test("m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1", "1+x1", "1+x2", "1+y");
}
public void test042() throws Exception {
// test arg lists with named params
test("m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1;!2", "1+x1", "1+x2", "2-y");
}
public void testCommentSnippets001() throws Exception {
test(
"class X {static final num MAX = 0;num yc,xc;mth() {xc = yc = MA!1X;x!2c.abs();num f = M!3AX;}}",
"1+MAX",
"2+xc",
"3+MAX");
}
public void testCommentSnippets002() throws Exception {
test(
"class Y {String x='hi';mth() {x.l!1ength;int n = 0;x!2.codeUnitAt(n!3);}}",
"1+length",
"2+x",
"3+n");
}
public void testCommentSnippets004() throws Exception {
test(
"class A {!1int x; !2mth() {!3int y = this.!5x!6;}}class B{}",
"1+A",
"2+B",
"3+x",
"3-y",
"5+mth",
"6+x");
}
public void testCommentSnippets005() throws Exception {
test(
"class Date { static Date JUN, JUL;}class X { m() { return Da!1te.JU!2L; }}",
"1+Date",
"2+JUN",
"2+JUL");
}
public void testCommentSnippets007() throws Exception {
test(
"class C {mth(Map x, !1) {}mtf(!2, Map x) {}m() {for (in!3t i=0; i<5; i++); A!4 x;}}class int{}class Arrays{}class bool{}",
"1+bool",
"2+bool",
"3+int",
"4+Arrays");
}
public void testCommentSnippets008() throws Exception {
test("class Date{}final num M = Dat!1", "1+Date");
}
public void testCommentSnippets009() throws Exception {
// space, char, eol are important
test(
"class Map{}class Maps{}class x extends!5 !2M!3 !4implements!6 !1\n{}",
"1+Map",
"2+Maps",
"3+Maps",
"4-Maps",
"4+implements",
"5-Maps",
"6-Map",
"6+implements");
}
public void testCommentSnippets010() throws Exception {
// space, char, eol are important
test("class Map{}class x implements !1{}", "1+Map");
}
public void testCommentSnippets011() throws Exception {
// space, char, eol are important
test("class Map{}class x implements M!1{}", "1+Map");
}
public void testCommentSnippets012() throws Exception {
// space, char, eol are important
test("class Map{}class x implements M!1\n{}", "1+Map");
}
public void testCommentSnippets013() throws Exception {
test("class num{}class x !2{!1}!3", "1+num", "2-num", "3-num");
}
public void testCommentSnippets014() throws Exception {
// trailing space is important
test("class num{}typedef n!1 ;", "1+num");
}
public void testCommentSnippets015() throws Exception {
test("class D {f(){} g(){f!1(f!2);}}", "1+f", "2+f");
}
public void testCommentSnippets016() throws Exception {
test("class F {m() { m(); !1}}", "1+m");
}
public void testCommentSnippets017() throws Exception {
test("class F {var x = !1false;}", "1+true");
}
public void testCommentSnippets018() throws Exception {
test(
"class Map{}class Arrays{}class C{ m(!1){} n(!2 x, q)",
"1+Map",
"1-void",
"1-null",
"2+Arrays",
"2-void",
"2-null");
}
public void testCommentSnippets019() throws Exception {
test("class A{m(){Object x;x.!1/**/clear()", "1+toString");
}
public void testCommentSnippets020() throws Exception {
test(
"classMap{}class tst {var newt;void newf(){}test() {var newz;new!1/**/;}}",
"1+newt",
"1+newf",
"1+newz",
"1-Map");
}
public void testCommentSnippets021() throws Exception {
test(
"class Map{}class tst {var newt;void newf(){}test() {var newz;new !1/**/;}}",
"1+Map",
"1-newt");
}
public void testCommentSnippets022() throws Exception {
test("class Map{}class F{m(){new !1;}}", "1+Map");
}
public void testCommentSnippets022a() throws Exception {
test("class Map{}class F{m(){new !1", "1+Map");
}
public void testCommentSnippets022b() throws Exception {
test("class Map{factory Map.qq(){return null;}}class F{m(){new Map.!1qq();}}", "1+qq");
}
public void testCommentSnippets023() throws Exception {
test("class X {X c; X(this.!1c!3) : super() {c.!2}}", "1+c", "2+c", "3+c");
}
public void testCommentSnippets024() throws Exception {
test("class q {m(Map q){var x;m(!1)}n(){var x;n(!2)}}", "1+x", "2+x");
}
public void testCommentSnippets025() throws Exception {
test("class q {num m() {var q; num x=!1 q!3 + !2/**/;}}", "1+q", "2+q", "3+q");
}
public void testCommentSnippets026() throws Exception {
test("class List{}class a implements !1{}", "1+List");
}
public void testCommentSnippets027() throws Exception {
test(
"class String{}class List{}class test <X extends !1String!2> {}",
"1+List",
"2+String",
"2-List");
}
public void testCommentSnippets028() throws Exception {
test(
"class String{}class List{}class DateTime{}typedef T Y<T extends !1>(List input);",
"1+DateTime",
"1+String");
}
public void testCommentSnippets029() throws Exception {
// test("interface A<X> default B<X extends !1List!2> {}", "1+DateTime", "2+List"); bad test
}
public void testCommentSnippets030() throws Exception {
test(
"class Bar<T extends Foo> {const Bar(!1T!2 k);T!3 m(T!4 a, T!5 b){}final T!6 f = null;}",
"1+T",
"2+T",
"3+T",
"4+T",
"5+T",
"6+T");
}
public void testCommentSnippets031() throws Exception {
test(
"class Bar<T extends Foo> {m(x){if (x is !1) return;if (x is!!!2)}}",
"1+Bar",
"1+T",
"2+T",
"2+Bar");
}
public void testCommentSnippets032() throws Exception {
test("class Fit{}class Bar<T extends Fooa> {const F!1ara();}", "1+Fit", "1+Fara", "1-Bar");
}
public void testCommentSnippets033() throws Exception {
// Type propagation
test(
"class List{add(){}length(){}}t1() {var x;if (x is List) {x.!1add(3);}}",
"1+add",
"1+length");
}
public void testCommentSnippets034() throws Exception {
// Moved to CompletionLibraryTests
}
public void testCommentSnippets035() throws Exception {
// Type propagation
test(
"class List{clear(){}length(){}}t3() {var x=new List(), y=x.!1length();x.!2clear();}",
"1+length",
"2+clear");
}
public void testCommentSnippets036() throws Exception {
test("class List{}t3() {var x=new List!1}", "1+List");
}
public void testCommentSnippets037() throws Exception {
test("class List{factory List.from(){}}t3() {var x=new List.!1}", "1+from");
}
public void testCommentSnippets038() throws Exception {
test("f(){int xa; String s = '$x!1';}", "1+xa");
}
public void testCommentSnippets038a() throws Exception {
test("int xa; String s = '$x!1'", "1+xa");
}
public void testCommentSnippets039() throws Exception {
test("f(){int xa; String s = '$!1';}", "1+xa");
}
public void testCommentSnippets039a() throws Exception {
test("int xa; String s = '$!1'", "1+xa");
}
public void testCommentSnippets040() throws Exception {
test("class List{add(){}}class Map{}class X{m(){List list; list.!1 Map map;}}", "1+add");
}
public void testCommentSnippets041() throws Exception {
test("class List{add(){}length(){}}class X{m(){List list; list.!1 zox();}}", "1+add");
}
public void testCommentSnippets042() throws Exception {
test(
"class DateTime{static const int WED=3;int get day;}fd(){DateTime d=new DateTime.now();d.!1WED!2;}",
"1+day",
"2-WED");
}
public void testCommentSnippets043() throws Exception {
test("class L{var k;void.!1}", "1-k");
}
public void testCommentSnippets044() throws Exception {
test("class List{}class XXX {XXX.fisk();}main() {main(); new !1}}", "1+List", "1+XXX.fisk");
}
public void testCommentSnippets045() throws Exception {
// Moved to CompletionLibraryTests
}
public void testCommentSnippets046() throws Exception {
// Moved to CompletionLibraryTests
}
public void testCommentSnippets047() throws Exception {
test("f(){int x;int y=!1;}", "1+x");
}
public void testCommentSnippets048() throws Exception {
// TODO: Use another library, dart:json is gone.
// test("import 'dart:json' as json;f() {var x=new js!1}", "1+json");
}
public void testCommentSnippets049() throws Exception {
// TODO: Use another library, dart:json is gone.
// test(//
// src(//
// "import 'dart:json' as json;",
// "import 'dart:json' as jxx;",
// "class JsonParserX{}",
// "f1() {var x=new !2j!1s!3}"),
// "1+json",
// "1+jxx",
// "2+json",
// "2+jxx",
// "2-JsonParser",
// "3+json",
// "3-jxx");
}
public void testCommentSnippets050() throws Exception {
test(//
src(//
"class xdr {",
" xdr();",
" const xdr.a(a,b,c);",
" xdr.b();",
" f() => 3;",
"}",
"class xa{}",
"k() {",
" new x!1dr().f();",
" const x!2dr.!3a(1, 2, 3);",
"}"),
"1+xdr",
"1+xa",
"1+xdr.a",
"1+xdr.b",
"2-xa",
"2-xdr",
"2+xdr.a",
"2-xdr.b",
"3-b",
"3+a");
}
public void testCommentSnippets051() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void r() {",
" var v;",
" if (v is String) {",
" v.!1length;",
" v.!2getKeys;",
" }",
"}");
test(source, "1+length", "2-getKeys");
}
public void testCommentSnippets052() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void r() {",
" List<String> values = ['a','b','c'];",
" for (var v in values) {",
" v.!1toUpperCase;",
" v.!2getKeys;",
" }",
"}");
test(source, "1+toUpperCase", "2-getKeys");
}
public void testCommentSnippets053() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void r() {",
" var v;",
" while (v is String) {",
" v.!1toUpperCase;",
" v.!2getKeys;",
" }",
"}");
test(source, "1+toUpperCase", "2-getKeys");
}
public void testCommentSnippets054() throws Exception {
// TODO Enable after type propagation is fully implemented.
// String source = src(
// "class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
// "void r() {",
// " var v;",
// " for (; v is String; v.!1isEmpty) {",
// " v.!2toUpperCase;",
// " v.!3getKeys;",
// " }",
// "}");
// test(source, "1+isEmpty", "2+toUpperCase", "3-getKeys");
}
public void testCommentSnippets055() throws Exception {
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void r() {",
" String v;",
" if (v is Object) {",
" v.!1toUpperCase;",
" }",
"}");
test(source, "1+toUpperCase");
}
public void testCommentSnippets056() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void f(var v) {",
" if (v is!! String) {",
" return;",
" }",
" v.!1toUpperCase;",
"}");
test(source, "1+toUpperCase");
}
public void testCommentSnippets057() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void f(var v) {",
" if ((v as String).length == 0) {",
" v.!1toUpperCase;",
" }",
"}");
test(source, "1+toUpperCase");
}
public void testCommentSnippets058() throws Exception {
String source = src(
"typedef vo!2id callback(int k);",
"void x(callback q){}",
"void r() {",
" callback v;",
" x(!1);",
"}");
test(source, "1+v", "2+void");
}
public void testCommentSnippets059() throws Exception {
test("f(){((int x) => x+4).!1call(1);}", "1-call");
}
public void testCommentSnippets060() throws Exception {
String source = src(
"class Map{}",
"abstract class MM extends Map{factory MM() => new Map();}",
"class Z {",
" MM x;",
" f() {",
" x!1",
" }",
"}");
test(source, "1+x", "1-x[]");
}
public void testCommentSnippets061() throws Exception {
test(
"class A{m(){!1f(3);!2}}n(){!3f(3);!4}f(x)=>x*3;",
"1+f",
"1+n",
"2+f",
"2+n",
"3+f",
"3+n",
"4+f",
"4+n");
}
public void testCommentSnippets062() throws Exception {
// Moved to CompletionLibraryTests
}
public void testCommentSnippets063() throws Exception {
// Type propagation.
String source = src(
"class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}",
"void r(var v) {",
" v.!1toUpperCase;",
" assert(v is String);",
" v.!2toUpperCase;",
"}");
test(source, "1-toUpperCase", "2+toUpperCase");
}
public void testCommentSnippets064() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.!9h()..!1a()..!2b().!7g();",
" x.!8j..!3b()..!4c..!6c..!5a();",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+a", "2+b", "1-g", "2-h", "3+b", "4+c", "5+a", "6+c", "7+g", "8+j", "9+h");
}
public void testCommentSnippets065() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.h()..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+a");
}
public void testCommentSnippets066() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.h()..a()..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+b");
}
public void testCommentSnippets067() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.h()..a()..c..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+b");
}
public void testCommentSnippets068() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.j..b()..c..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+c");
}
public void testCommentSnippets069() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.j..b()..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+c");
}
public void testCommentSnippets070() throws Exception {
String source = src(
"class Spline {",
" Line c;",
" Spline a() {",
" return this;",
" }",
" Line b() {",
" return null;",
" }",
" Spline f() {",
" Line x = new Line();",
" x.j..!1;",
" }",
"}",
"class Line {",
" Spline j;",
" Line g() {",
" return this;",
" }",
" Spline h() {",
" return null;",
" }",
"}");
test(source, "1+b");
}
public void testCommentSnippets072() throws Exception {
String source = src(
"class X {",
" int _p;",
" set p(int x) => _p = x;",
"}",
"f() {",
" X x = new X();",
" x.!1p = 3;",
"}");
test(source, "1+p");
}
public void testCommentSnippets073() throws Exception {
String source = src(
"class X {",
" m() {",
" JSON.stri!1;",
" X f = null;",
" }",
"}",
"class JSON {",
" static stringify() {}",
"}");
test(source, "1+stringify");
}
public void testCommentSnippets074() throws Exception {
String source = src(//
"class X {",
" m() {",
" _x!1",
" }",
" _x1(){}",
"}");
test(source, "1+_x1");
}
public void testCommentSnippets075() throws Exception {
test("p(x)=>0;var E;f(q)=>!1p(!2E);", "1+p", "2+E");
}
public void testCommentSnippets076() throws Exception {
test(
"class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3int>>();}",
"1+List",
"2+int",
"3+int");
}
public void testCommentSnippets076a() throws Exception {
test(
"class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3>>();}",
"1+List",
"2+int",
"3+int");
}
public void testCommentSnippets077() throws Exception {
test(
src(
"class FileMode {",
" static const READ = const FileMode._internal(0);",
" static const WRITE = const FileMode._internal(1);",
" static const APPEND = const FileMode._internal(2);",
" const FileMode._internal(int this._mode);",
" factory FileMode._internal1(int this._mode);",
" factory FileMode(_mode);",
" final int _mode;",
"}",
"class File {",
" factory File(String path) => null;",
" factory File.fromPath(Path path) => null;",
"}",
"f() => new Fil!1"),
"1+File",
"1+File.fromPath",
"1+FileMode",
"1+FileMode._internal1",
"1+FileMode._internal");
}
public void testCommentSnippets078() throws Exception {
test("class Map{static from()=>null;clear(){}}void main() { Map.!1 }", "1+from", "1-clear"); // static method, instance method
}
public void testCommentSnippets079() throws Exception {
test("class Map{static from()=>null;clear(){}}void main() { Map s; s.!1 }", "1-from", "1+clear"); // static method, instance method
}
public void testCommentSnippets080() throws Exception {
test("class RuntimeError{var message;}void main() { RuntimeError.!1 }", "1-message"); // field
}
public void testCommentSnippets081() throws Exception {
test("class Foo {this.!1}", "1-Object");
}
public void testCommentSnippets082() throws Exception {
String source = src(
"class HttpRequest {}",
"class HttpResponse {}",
"main() {",
" var v = (HttpRequest req, HttpResp!1)",
"}");
test(source, "1+HttpResponse");
}
public void testCommentSnippets083() throws Exception {
test("main() {(.!1)}", "1-toString");
}
public void testCommentSnippets083a() throws Exception {
test("main() { .!1 }", "1-toString");
}
public void testCommentSnippets083b() throws Exception {
test("main() { null.!1 }", "1+toString");
}
public void testCommentSnippets084() throws Exception {
test(
"class List{}class Map{}typedef X = !1Lis!2t with !3Ma!4p;",
"1+Map",
"2+List",
"2-Map",
"3+List",
"4+Map",
"4-List");
}
public void testCommentSnippets085() throws Exception {
test(
"class List{}class Map{}class Z extends List with !1Ma!2p {}",
"1+List",
"1+Map",
"2+Map",
"2-List");
}
public void testCommentSnippets086() throws Exception {
test("class Q{f(){xy() {!2};x!1y();}}", "1+xy", "2+f", "2-xy");
}
public void testCommentSnippets087() throws Exception {
test("class Map{}class Q extends Object with !1Map {}", "1+Map", "1-HashMap");
}
public void testCommentSnippets088() throws Exception {
String source = src(
"class A {",
" int f;",
" B m(){}",
"}",
"class B extends A {",
" num f;",
" A m(){}",
"}",
"class Z {",
" B q;",
" f() {q.!1}",
"}");
test(source, "1+f", "1+m"); // f->num, m()->A
}
public void testCommentSnippets089() throws Exception {
String source = src(
"class Q {",
" fqe() {",
" xya() {",
" xyb() {",
" !1",
" }",
" !3 xyb();",
" };",
" xza() {",
" !2",
" }",
" xya();",
" !4 xza();",
" }",
" fqi() {",
" !5",
" }",
"}");
test(
source,
"1+fqe",
"1+fqi",
"1+Q",
"1-xya",
"1-xyb",
"1-xza",
"2+fqe",
"2+fqi",
"2+Q",
"2-xya",
"2-xyb",
"2-xza",
"3+fqe",
"3+fqi",
"3+Q",
"3-xya",
"3+xyb",
"3-xza",
"4+fqe",
"4+fqi",
"4+Q",
"4+xya",
"4-xyb",
"4+xza",
"5+fqe",
"5+fqi",
"5+Q",
"5-xya",
"5-xyb",
"5-xza");
}
public void testCommentSnippets090() throws Exception {
test("class X { f() { var a = 'x'; a.!1 }}", "1+length");
}
public void testCompletion_alias_field() throws Exception {
test("typedef int fnint(int k); fn!1int x;", "1+fnint");
}
public void testCompletion_annotation_argumentList() throws Exception {
test(src(//
"class AAA {",
" const AAA({int aaa, int bbb});",
"}",
"",
"@AAA(!1)",
"main() {",
"}"), "1+AAA:" + ProposalKind.ARGUMENT_LIST, "1+aaa", "1+bbb");
}
public void testCompletion_annotation_topLevelVar() throws Exception {
test(src(//
"const fooConst = null;",
"final fooNotConst = null;",
"const bar = null;",
"",
"@foo!1",
"main() {",
"}"), "1+fooConst", "1-fooNotConst", "1-bar");
}
public void testCompletion_annotation_type() throws Exception {
test(src(//
"class AAA {",
" const AAA({int a, int b});",
" const AAA.nnn(int c, int d);",
"}",
"",
"",
"@AAA!1",
"main() {",
"}"), "1+AAA:" + ProposalKind.CONSTRUCTOR, "1+AAA.nnn:" + ProposalKind.CONSTRUCTOR);
}
public void testCompletion_annotation_type_inClass_withoutMember() throws Exception {
test(src(//
"class AAA {",
" const AAA();",
"}",
"",
"class C {",
" @A!1",
"}"), "1+AAA:" + ProposalKind.CONSTRUCTOR);
}
public void testCompletion_argument_typeName() throws Exception {
test(src(//
"class Enum {",
" static Enum FOO = new Enum();",
"}",
"f(Enum e) {}",
"main() {",
" f(En!1);",
"}"), "1+Enum");
}
public void testCompletion_arguments_ignoreEmpty() throws Exception {
test(src(//
"class A {",
" test() {}",
"}",
"main(A a) {",
" a.test(!1);",
"}"), "1-test");
}
public void testCompletion_as_asIdentifierPrefix() throws Exception {
test(src(//
"main(p) {",
" var asVisible;",
" var v = as!1;",
"}"), "1+asVisible");
}
public void testCompletion_as_asPrefixedIdentifierStart() throws Exception {
test(src(//
"class A {",
" var asVisible;",
"}",
"",
"main(A p) {",
" var v = p.as!1;",
"}"), "1+asVisible");
}
public void testCompletion_as_incompleteStatement() throws Exception {
test(src(//
"class MyClass {}",
"main(p) {",
" var justSomeVar;",
" var v = p as !1",
"}"), "1+MyClass", "1-justSomeVar");
}
public void testCompletion_cascade() throws Exception {
test(src(//
"class A {",
" aaa() {}",
"}",
"",
"",
"main(A a) {",
" a..!1 aaa();",
"}"), "1+aaa", "1-main");
}
public void testCompletion_combinator_afterComma() throws Exception {
test("import 'dart:math' show cos, !1;", "1+PI", "1+sin", "1+Random", "1-String");
}
public void testCompletion_combinator_ended() throws Exception {
test("import 'dart:math' show !1;", "1+PI", "1+sin", "1+Random", "1-String");
}
public void testCompletion_combinator_export() throws Exception {
test("export 'dart:math' show !1;", "1+PI", "1+sin", "1+Random", "1-String");
}
public void testCompletion_combinator_hide() throws Exception {
test("import 'dart:math' hide !1;", "1+PI", "1+sin", "1+Random", "1-String");
}
public void testCompletion_combinator_notEnded() throws Exception {
test("import 'dart:math' show !1", "1+PI", "1+sin", "1+Random", "1-String");
}
public void testCompletion_combinator_usePrefix() throws Exception {
test("import 'dart:math' show s!1", "1+sin", "1+sqrt", "1-cos", "1-String");
}
public void testCompletion_constructor_field() throws Exception {
test("class X { X(this.field); int f!1ield;}", "1+field");
}
public void testCompletion_constructorArguments_showOnlyCurrent() throws Exception {
test(src(//
"class A {",
" A.first(int p);",
" A.second(double p);",
"}",
"main() {",
" new A.first(!1);",
"}"), "1+A.first", "1-A.second");
}
public void testCompletion_constructorArguments_whenPrefixedType() throws Exception {
test(src(//
"import 'dart:math' as m;",
"main() {",
" new m.Random(!1);",
"}"), "1+Random:ARGUMENT_LIST");
}
public void testCompletion_dartDoc_reference_forClass() throws Exception {
test(src(//
"/**",
" * [int!1]",
" * [method!2]",
" */",
"class AAA {",
" methodA() {}",
"}",
""), "1+int", "1-method", "2+methodA", "2-int");
}
public void testCompletion_dartDoc_reference_forConstructor() throws Exception {
test(src(//
"class A {",
" /**",
" * [aa!1]",
" * [int!2]",
" * [method!3]",
" */",
" A.named(aaa, bbb) {}",
" methodA() {}",
"}"), "1+aaa", "1-bbb", "2+int", "2-double", "3+methodA");
}
public void testCompletion_dartDoc_reference_forFunction() throws Exception {
test(src(//
"/**",
" * [aa!1]",
" * [int!2]",
" * [function!3]",
" */",
"functionA(aaa, bbb) {}",
"functionB() {}",
""), "1+aaa", "1-bbb", "2+int", "2-double", "3+functionA", "3+functionB", "3-int");
}
public void testCompletion_dartDoc_reference_forFunctionTypeAlias() throws Exception {
test(src(//
"/**",
" * [aa!1]",
" * [int!2]",
" * [Function!3]",
" */",
"typedef FunctionA(aaa, bbb) {}",
"typedef FunctionB() {}",
""), "1+aaa", "1-bbb", "2+int", "2-double", "3+FunctionA", "3+FunctionB", "3-int");
}
public void testCompletion_dartDoc_reference_forMethod() throws Exception {
test(src(//
"class A {",
" /**",
" * [aa!1]",
" * [int!2]",
" * [method!3]",
" */",
" methodA(aaa, bbb) {}",
" methodB() {}",
"}"), "1+aaa", "1-bbb", "2+int", "2-double", "3+methodA", "3+methodB", "3-int");
}
public void testCompletion_dartDoc_reference_incomplete() throws Exception {
test(src(//
"/**",
" * [doubl!1 some text",
" * other text",
" */",
"class A {}",
"/**",
" * [!2 some text",
" * other text",
" */",
"class B {}",
"/**",
" * [!3] some text",
" */",
"class C {}",
""), "1+double", "1-int", "2+int", "2+String", "3+int", "3+String");
}
public void testCompletion_double_inFractionPart() throws Exception {
test(src(//
"main() {",
" 1.0!1",
"}"), "1-abs", "1-main");
}
public void testCompletion_enum() throws Exception {
resetWithEnum();
test(src(//
"enum MyEnum {A, B, C}",
"main() {",
" MyEnum.!1;",
"}"), "1+values", "1+A", "1+B", "1+C");
}
public void testCompletion_exactPrefix_hasHigherRelevance() throws Exception {
test(src(//
"var STR;",
"main(p) {",
" var str;",
" str!1;",
" STR!2;",
" Str!3;",
"}"),//
"1+str,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1),
"1+STR,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0),
"2+STR,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1),
"2+str,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0),
"3+String,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1),
"3+STR,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0),
"3+str,rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0));
}
public void testCompletion_export_dart() throws Exception {
test(
src(//
"import 'dart:math",
"import 'dart:_chrome",
"import 'dart:_collection.dev",
"export 'dart:!1"),
"1+dart:core",
"1+dart:math",
"1-dart:_chrome",
"1-dart:_collection.dev");
}
public void testCompletion_export_noStringLiteral_noSemicolon() throws Exception {
test(src(//
"import !1",
"",
"class A {}"), resultWithCursor("1+'dart:!';"), resultWithCursor("1+'package:!';"));
}
public void testCompletion_forStmt_vars() throws Exception {
test(
"class int{}class Foo { mth() { for (in!1t i = 0; i!2 < 5; i!3++); }}",
"1+int",
"2+i",
"3+i");
}
public void testCompletion_function() throws Exception {
test(
"class String{}class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1) => a.compareTo(b)); }}",
"1+String");
}
public void testCompletion_function_partial() throws Exception {
test(
"class String{}class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1)); }}",
"1+String");
}
public void testCompletion_functionTypeParameter_namedArgument() throws Exception {
test(src(//
"typedef FFF(a, b, {x1, x2, y});",
"main(FFF fff) {",
" fff(1, 2, !1)!2;",
"}"), "1+x1", "2-x2");
}
public void testCompletion_ifStmt_field1() throws Exception {
test("class Foo { int myField = 7; mth() { if (!1) {}}}", "1+myField");
}
public void testCompletion_ifStmt_field1a() throws Exception {
test("class Foo { int myField = 7; mth() { if (!1) }}", "1+myField");
}
public void testCompletion_ifStmt_field2() throws Exception {
test("class Foo { int myField = 7; mth() { if (m!1) {}}}", "1+myField");
}
public void testCompletion_ifStmt_field2a() throws Exception {
test("class Foo { int myField = 7; mth() { if (m!1) }}", "1+myField");
}
public void testCompletion_ifStmt_field2b() throws Exception {
test("class Foo { myField = 7; mth() { if (m!1) {}}}", "1+myField");
}
public void testCompletion_ifStmt_localVar() throws Exception {
test("class Foo { mth() { int value = 7; if (v!1) {}}}", "1+value");
}
public void testCompletion_ifStmt_localVara() throws Exception {
test("class Foo { mth() { value = 7; if (v!1) {}}}", "1-value");
}
public void testCompletion_ifStmt_topLevelVar() throws Exception {
test("int topValue = 7; class Foo { mth() { if (t!1) {}}}", "1+topValue");
}
public void testCompletion_ifStmt_topLevelVara() throws Exception {
test("topValue = 7; class Foo { mth() { if (t!1) {}}}", "1+topValue");
}
public void testCompletion_ifStmt_unionType_nonStrict() throws Exception {
enableUnionTypes(false);
test(src(//
"class A { a() => null; x() => null}",
"class B { a() => null; y() => null}",
"void main() {",
" var x;",
" var c;",
" if(c) {",
" x = new A();",
" } else {",
" x = new B();",
" }",
" x.!1;",
"}"), "1+a", "1+x", "1+y");
}
public void testCompletion_ifStmt_unionType_strict() throws Exception {
enableUnionTypes(true);
test(src(//
"class A { a() => null; x() => null}",
"class B { a() => null; y() => null}",
"void main() {",
" var x;",
" var c;",
" if(c) {",
" x = new A();",
" } else {",
" x = new B();",
" }",
" x.!1;",
"}"), "1+a", "1-x", "1-y");
}
public void testCompletion_import() throws Exception {
test(src(//
"import '!1';"),
resultWithCursor("1+dart:!"),
resultWithCursor("1+package:!"));
}
public void testCompletion_import_dart() throws Exception {
test(
src(//
"import 'dart:math",
"import 'dart:_chrome",
"import 'dart:_collection.dev",
"import 'dart:!1"),
"1+dart:core",
"1+dart:math",
"1-dart:_chrome",
"1-dart:_collection.dev");
}
public void testCompletion_import_hasStringLiteral_noSemicolon() throws Exception {
test(src(//
"import '!1'",
"",
"class A {}"), resultWithCursor("1+dart:!"), resultWithCursor("1+package:!"));
}
public void testCompletion_import_noSpace() throws Exception {
test(src(//
"import!1",
""), resultWithCursor("1+ 'dart:!';"), resultWithCursor("1+ 'package:!';"));
}
public void testCompletion_import_noStringLiteral() throws Exception {
test(src(//
"import !1;"),
resultWithCursor("1+'dart:!'"),
resultWithCursor("1+'package:!'"));
}
public void testCompletion_import_noStringLiteral_noSemicolon() throws Exception {
test(src(//
"import !1",
"",
"class A {}"), resultWithCursor("1+'dart:!';"), resultWithCursor("1+'package:!';"));
}
public void testCompletion_incompleteClassMember() throws Exception {
test(src(//
"class A {",
" Str!1",
" final f = null;",
"}"), "1+String", "1-bool");
}
public void testCompletion_incompleteClosure_parameterType() throws Exception {
test(src(//
"f1(cb(String s)) {}",
"f2(String s) {}",
"main() {",
" f1((Str!1));",
" f2((Str!2));",
"}"), "1+String", "1-bool", "2+String", "2-bool");
}
public void testCompletion_inPeriodPeriod() throws Exception {
test(src(//
"main(String str) {",
" 1 < str.!1.length;",
" 1 + str.!2.length;",
" 1 + 2 * str.!3.length;",
"}"), "1+codeUnits", "2+codeUnits", "3+codeUnits");
}
public void testCompletion_instanceCreation_unresolved() throws Exception {
test(src(//
"class A {",
"}",
"main() {",
" new NoSuchClass(!1);",
" new A.noSuchConstructor(!2);",
"}"), "1+int", "2+int");
// no checks, but no exceptions
}
// TODO(scheglov)
// public void testCompletion_import_lib() throws Exception {
// addSource("/my_lib.dart", "");
// test("import '!1", "1+my_lib.dart");
// }
public void testCompletion_is() throws Exception {
test(src(//
"class MyClass {}",
"main(p) {",
" var isVariable;",
" if (p is MyCla!1) {}",
" var v1 = p is MyCla!2;",
" var v2 = p is !3;",
" var v2 = p is!4;",
"}"), "1+MyClass", "2+MyClass", "3+MyClass", "3-v1", "4+is", "4-isVariable");
}
public void testCompletion_is_asIdentifierStart() throws Exception {
test(src(//
"main(p) {",
" var isVisible;",
" var v1 = is!1;",
" var v2 = is!2",
"}"), "1+isVisible", "2+isVisible");
}
public void testCompletion_is_asPrefixedIdentifierStart() throws Exception {
test(src(//
"class A {",
" var isVisible;",
"}",
"",
"main(A p) {",
" var v1 = p.is!1;",
" var v2 = p.is!2",
"}"), "1+isVisible", "2+isVisible");
}
public void testCompletion_is_incompleteStatement1() throws Exception {
test(src(//
"class MyClass {}",
"main(p) {",
" var justSomeVar;",
" var v = p is !1",
"}"), "1+MyClass", "1-justSomeVar");
}
public void testCompletion_is_incompleteStatement2() throws Exception {
test(src(//
"class MyClass {}",
"main(p) {",
" var isVariable;",
" var v = p is!1",
"}"), "1+is", "1-isVariable");
}
public void testCompletion_keyword_in() throws Exception {
test("class Foo { int input = 7; mth() { if (in!1) {}}}", "1+input");
}
public void testCompletion_keyword_syntheticIdentifier() throws Exception {
test(src(//
"main() {",
" var caseVar;",
" var otherVar;",
" var v = case!1",
"}"), "1+caseVar", "1-otherVar");
}
public void testCompletion_libraryIdentifier_atEOF() throws Exception {
test("library int.!1", "1-parse", "1-bool");
}
public void testCompletion_libraryIdentifier_notEOF() throws Exception {
test(src(//
"library int.!1",
""), "1-parse", "1-bool");
}
public void testCompletion_methodRef_asArg_incompatibleFunctionType() throws Exception {
test(src(//
"foo( f(int p) ) {}",
"class Functions {",
" static myFuncInt(int p) {}",
" static myFuncDouble(double p) {}",
"}",
"bar(p) {}",
"main(p) {",
" foo( Functions.!1; );",
"}"), "1+myFuncInt:" + ProposalKind.METHOD_NAME, "1-myFuncDouble:"
+ ProposalKind.METHOD_NAME);
}
public void testCompletion_methodRef_asArg_notFunctionType() throws Exception {
test(src(//
"foo( f(int p) ) {}",
"class Functions {",
" static myFunc(int p) {}",
"}",
"bar(p) {}",
"main(p) {",
" foo( (int p) => Functions.!1; );",
"}"), "1+myFunc:" + ProposalKind.METHOD, "1-myFunc:" + ProposalKind.METHOD_NAME);
}
public void testCompletion_methodRef_asArg_ofFunctionType() throws Exception {
test(src(//
"foo( f(int p) ) {}",
"class Functions {",
" static int myFunc(int p) {}",
"}",
"main(p) {",
" foo(Functions.!1);",
"}"), "1+myFunc:" + ProposalKind.METHOD, "1+myFunc:" + ProposalKind.METHOD_NAME);
}
public void testCompletion_namedArgument_alreadyUsed() throws Exception {
test("func({foo}) {} main() { func(foo: 0, fo!1); }", "1-foo");
}
public void testCompletion_namedArgument_constructor() throws Exception {
test("class A {A({foo, bar}) {}} main() { new A(fo!1); }", "1+foo", "1-bar");
}
public void testCompletion_namedArgument_empty() throws Exception {
test(
"func({foo, bar}) {} main() { func(!1); }",
"1+foo:" + ProposalKind.NAMED_ARGUMENT,
"1-foo:" + ProposalKind.OPTIONAL_ARGUMENT);
}
public void testCompletion_namedArgument_function() throws Exception {
test("func({foo, bar}) {} main() { func(fo!1); }", "1+foo", "1-bar");
}
public void testCompletion_namedArgument_notNamed() throws Exception {
test("func([foo]) {} main() { func(fo!1); }", "1-foo");
}
public void testCompletion_namedArgument_unresolvedFunction() throws Exception {
test("main() { func(fo!1); }", "1-foo");
}
public void testCompletion_newMemberType1() throws Exception {
test(
"class Collection{}class List extends Collection{}class Foo { !1 }",
"1+Collection",
"1+List");
}
public void testCompletion_newMemberType2() throws Exception {
test(
"class Collection{}class List extends Collection{}class Foo {!1}",
"1+Collection",
"1+List");
}
public void testCompletion_newMemberType3() throws Exception {
test(
"class Collection{}class List extends Collection{}class Foo {L!1}",
"1-Collection",
"1+List");
}
public void testCompletion_newMemberType4() throws Exception {
test(
"class Collection{}class List extends Collection{}class Foo {C!1}",
"1+Collection",
"1-List");
}
public void testCompletion_positionalArgument_constructor() throws Exception {
test(src(//
"class A {",
" A([foo, bar]);",
"}",
"main() {",
" new A(!1);",
" new A(0, !2);",
"}"), "1+foo:" + ProposalKind.OPTIONAL_ARGUMENT, "1-bar", "2-foo", "2+bar:"
+ ProposalKind.OPTIONAL_ARGUMENT);
}
public void testCompletion_positionalArgument_function() throws Exception {
test(src(//
"func([foo, bar]) {}",
"main() {",
" func(!1);",
" func(0, !2);",
"}"), "1+foo:" + ProposalKind.OPTIONAL_ARGUMENT, "1-bar", "2-foo", "2+bar:"
+ ProposalKind.OPTIONAL_ARGUMENT);
}
public void testCompletion_preferStaticType() throws Exception {
test(
src(//
"class A {",
" foo() {}",
"}",
"class B extends A {",
" bar() {}",
"}",
"main() {",
" A v = new B();",
" v.!1",
"}"),
"1+foo",
"1-bar,potential=false,declaringType=B",
"1+bar,potential=true,declaringType=B");
}
public void testCompletion_privateElement_sameLibrary_constructor() throws Exception {
test(src(//
"class A {",
" A._c();",
" A.c();",
"}",
"main() {",
" new A.!1",
"}"), "1+_c", "1+c");
}
public void testCompletion_privateElement_sameLibrary_member() throws Exception {
test(src(//
"class A {",
" _m() {}",
" m() {}",
"}",
"main(A a) {",
" a.!1",
"}"), "1+_m", "1+m");
}
public void testCompletion_propertyAccess_whenClassTarget() throws Exception {
test(src(//
"class A {",
" static int FIELD;",
" int field;",
"}",
"main() {",
" A.!1",
"}"), "1+FIELD", "1-field");
}
public void testCompletion_propertyAccess_whenClassTarget_excludeSuper() throws Exception {
test(src(//
"class A {",
" static int FIELD_A;",
" static int methodA() {}",
"}",
"class B extends A {",
" static int FIELD_B;",
" static int methodB() {}",
"}",
"main() {",
" B.!1;",
"}"), "1+FIELD_B", "1-FIELD_A", "1+methodB", "1-methodA");
}
public void testCompletion_propertyAccess_whenInstanceTarget() throws Exception {
test(src(//
"class A {",
" static int FIELD;",
" int fieldA;",
"}",
"class B {",
" A a;",
"}",
"class C extends A {",
" int fieldC;",
"}",
"main(B b, C c) {",
" b.a.!1;",
" c.!2;",
"}"), "1-FIELD", "1+fieldA", "2+fieldC", "2+fieldA");
}
public void testCompletion_return_withIdentifierPrefix() throws Exception {
test("f() { var vvv = 42; return v!1 }", "1+vvv");
}
public void testCompletion_return_withoutExpression() throws Exception {
test("f() { var vvv = 42; return !1 }", "1+vvv");
}
public void testCompletion_staticField1() throws Exception {
test(
"class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}",
"1+MAX_D",
"X+xc",
"Y+yc",
"2+num",
"3+num",
"4+Sunflower");
}
public void testCompletion_super_superType() throws Exception {
test(src(//
"class A {",
" var fa;",
" ma() {}",
"}",
"class B extends A {",
" var fb;",
" mb() {}",
" main() {",
" super.!1",
" }",
"}"), "1+fa", "1-fb", "1+ma", "1-mb");
}
public void testCompletion_superConstructorInvocation_noNamePrefix() throws Exception {
test(src(//
"class A {",
" A.fooA();",
" A.fooB();",
" A.bar();",
"}",
"class B extends A {",
" B() : super.!1",
"}"), "1+fooA", "1+fooB", "1+bar");
}
public void testCompletion_superConstructorInvocation_withNamePrefix() throws Exception {
test(src(//
"class A {",
" A.fooA();",
" A.fooB();",
" A.bar();",
"}",
"class B extends A {",
" B() : super.f!1",
"}"), "1+fooA", "1+fooB", "1-bar");
}
public void testCompletion_this_bad_inConstructorInitializer() throws Exception {
test(src(//
"class A {",
" var f;",
" A() : f = this.!1;",
"}"), "1-toString");
}
public void testCompletion_this_bad_inFieldDeclaration() throws Exception {
test(src(//
"class A {",
" var f = this.!1;",
"}"), "1-toString");
}
public void testCompletion_this_bad_inStaticMethod() throws Exception {
test(src(//
"class A {",
" static m() {",
" this.!1;",
" }",
"}"), "1-toString");
}
public void testCompletion_this_bad_inTopLevelFunction() throws Exception {
test(src(//
"main() {",
" this.!1;",
"}"), "1-toString");
}
public void testCompletion_this_bad_inTopLevelVariableDeclaration() throws Exception {
test(src(//
"var v = this.!1;"),
"1-toString");
}
public void testCompletion_this_OK_inConstructorBody() throws Exception {
test(src(//
"class A {",
" var f;",
" m() {}",
" A() {",
" this.!1;",
" }",
"}"), "1+f", "1+m");
}
public void testCompletion_this_OK_localAndSuper() throws Exception {
test(src(//
"class A {",
" var fa;",
" ma() {}",
"}",
"class B extends A {",
" var fb;",
" mb() {}",
" main() {",
" this.!1",
" }",
"}"), "1+fa", "1+fb", "1+ma", "1+mb");
}
public void testCompletion_topLevelField_init2() throws Exception {
test("class DateTime{static var JUN;}final num M = Dat!1eTime.JUN;", "1+DateTime", "1-void");
}
public void testCompletion_while() throws Exception {
test("class Foo { int boo = 7; mth() { while (b!1) {} }}", "1+boo");
}
// TODO Improve proposals for optional params.
public void testSingle() throws Exception {
test("class A {int x; !2mth() {int y = this.x;}}class B{}", "2+B");
}
}