View | Details | Raw Unified | Return to bug 421479 | Differences between
and this patch

Collapse All | Expand All

(-)ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java (+493 lines)
Lines 930-935 Link Here
930
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
930
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
931
	}
931
	}
932
932
933
	// Bug 421479
934
	public void testConvertToLambda19() throws Exception {
935
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
936
		StringBuffer buf= new StringBuffer();
937
		buf.append("package test1;\n");
938
		buf.append("@FunctionalInterface\n");
939
		buf.append("interface Func2 {\n");
940
		buf.append("    enum En {\n");
941
		buf.append("        A, B;\n");
942
		buf.append("        enum COLOR {\n");
943
		buf.append("            D, E\n");
944
		buf.append("        }\n");
945
		buf.append("    }\n");
946
		buf.append("\n");
947
		buf.append("    void foo();\n");
948
		buf.append("\n");
949
		buf.append("    String NAME = \"\";\n");
950
		buf.append("\n");
951
		buf.append("    static String staticName() {\n");
952
		buf.append("        return NAME;\n");
953
		buf.append("    }\n");
954
		buf.append("}\n");
955
		buf.append("\n");
956
		buf.append("class Test2 {\n");
957
		buf.append("    void bar() {\n");
958
		buf.append("        Func2 f = new Func2() {\n");
959
		buf.append("            @Override\n");
960
		buf.append("            public void foo() {\n");
961
		buf.append("                System.out.println(NAME);\n");
962
		buf.append("                System.out.println(Func2.NAME);\n");
963
		buf.append("                System.out.println(En.A);\n");
964
		buf.append("                System.out.println(Func2.En.A);\n");
965
		buf.append("                System.out.println(En.COLOR.D);\n");
966
		buf.append("                System.out.println(Func2.En.COLOR.D);\n");
967
		buf.append("                System.out.println(Test2.this);\n");
968
		buf.append("                bar();\n");
969
		buf.append("            }\n");
970
		buf.append("        };\n");
971
		buf.append("    }\n");
972
		buf.append("}\n");
973
		ICompilationUnit cu= pack1.createCompilationUnit("Func2.java", buf.toString(), false, null);
974
975
		int offset= buf.toString().indexOf("public void");
976
		AssistContext context= getCorrectionContext(cu, offset, 0);
977
		assertNoErrors(context);
978
		List proposals= collectAssists(context, false);
979
980
		assertNumberOfProposals(proposals, 1);
981
		assertCorrectLabels(proposals);
982
983
		buf= new StringBuffer();
984
		buf.append("package test1;\n\n");
985
		buf.append("import test1.Func2.En;\n\n");
986
		buf.append("@FunctionalInterface\n");
987
		buf.append("interface Func2 {\n");
988
		buf.append("    enum En {\n");
989
		buf.append("        A, B;\n");
990
		buf.append("        enum COLOR {\n");
991
		buf.append("            D, E\n");
992
		buf.append("        }\n");
993
		buf.append("    }\n");
994
		buf.append("\n");
995
		buf.append("    void foo();\n");
996
		buf.append("\n");
997
		buf.append("    String NAME = \"\";\n");
998
		buf.append("\n");
999
		buf.append("    static String staticName() {\n");
1000
		buf.append("        return NAME;\n");
1001
		buf.append("    }\n");
1002
		buf.append("}\n");
1003
		buf.append("\n");
1004
		buf.append("class Test2 {\n");
1005
		buf.append("    void bar() {\n");
1006
		buf.append("        Func2 f = () -> {\n");
1007
		buf.append("            System.out.println(Func2.NAME);\n");
1008
		buf.append("            System.out.println(Func2.NAME);\n");
1009
		buf.append("            System.out.println(Func2.En.A);\n");
1010
		buf.append("            System.out.println(Func2.En.A);\n");
1011
		buf.append("            System.out.println(En.COLOR.D);\n");
1012
		buf.append("            System.out.println(Func2.En.COLOR.D);\n");
1013
		buf.append("            System.out.println(Test2.this);\n");
1014
		buf.append("            bar();\n");
1015
		buf.append("        };\n");
1016
		buf.append("    }\n");
1017
		buf.append("}\n");
1018
		String expected1= buf.toString();
1019
1020
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1021
	}
1022
1023
	// Bug 421479
1024
	public void testConvertToLambda20() throws Exception {
1025
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1026
		StringBuffer buf= new StringBuffer();
1027
		buf.append("package test1;\n");
1028
		buf.append("interface Func<T> {\n");
1029
		buf.append("    void go();\n");
1030
		buf.append("    String NAME = Func.class.getName();\n");
1031
		buf.append("}\n");
1032
		buf.append("\n");
1033
		buf.append("public class Test {\n");
1034
		buf.append("    void foo() {\n");
1035
		buf.append("        Func<String> f= new Func<String>() {\n");
1036
		buf.append("            @Override\n");
1037
		buf.append("            public void go() {\n");
1038
		buf.append("                System.out.println(NAME);\n");
1039
		buf.append("            }\n");
1040
		buf.append("        };\n");
1041
		buf.append("    }\n");
1042
		buf.append("}\n");
1043
		ICompilationUnit cu= pack1.createCompilationUnit("Test.java", buf.toString(), false, null);
1044
1045
		int offset= buf.toString().indexOf("public void");
1046
		AssistContext context= getCorrectionContext(cu, offset, 0);
1047
		assertNoErrors(context);
1048
		List proposals= collectAssists(context, false);
1049
1050
		assertNumberOfProposals(proposals, 1);
1051
		assertCorrectLabels(proposals);
1052
1053
		buf= new StringBuffer();
1054
		buf.append("package test1;\n");
1055
		buf.append("interface Func<T> {\n");
1056
		buf.append("    void go();\n");
1057
		buf.append("    String NAME = Func.class.getName();\n");
1058
		buf.append("}\n");
1059
		buf.append("\n");
1060
		buf.append("public class Test {\n");
1061
		buf.append("    void foo() {\n");
1062
		buf.append("        Func<String> f= () -> System.out.println(Func.NAME);\n");
1063
		buf.append("    }\n");
1064
		buf.append("}\n");
1065
		String expected1= buf.toString();
1066
1067
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1068
	}
1069
1070
	// Bug 421479
1071
	public void testConvertToLambda21() throws Exception {
1072
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1073
		StringBuffer buf= new StringBuffer();
1074
		buf.append("package test1;\n");
1075
		buf.append("import test1.Func2.En.COLOR;\n");
1076
		buf.append("@FunctionalInterface\n");
1077
		buf.append("interface Func2 {\n");
1078
		buf.append("    enum En {\n");
1079
		buf.append("        A, B;\n");
1080
		buf.append("        enum COLOR {\n");
1081
		buf.append("            D, E\n");
1082
		buf.append("        }\n");
1083
		buf.append("    }\n");
1084
		buf.append("\n");
1085
		buf.append("    void foo();\n");
1086
		buf.append("\n");
1087
		buf.append("    String NAME = \"\";\n");
1088
		buf.append("\n");
1089
		buf.append("    static String staticName() {\n");
1090
		buf.append("        return NAME;\n");
1091
		buf.append("    }\n");
1092
		buf.append("}\n");
1093
		buf.append("\n");
1094
		buf.append("class Test2 {\n");
1095
		buf.append("    void bar() {\n");
1096
		buf.append("        Func2 f = new Func2() {\n");
1097
		buf.append("            @Override\n");
1098
		buf.append("            public void foo() {\n");
1099
		buf.append("                System.out.println(COLOR.D);\n");
1100
		buf.append("            }\n");
1101
		buf.append("        };\n");
1102
		buf.append("    }\n");
1103
		buf.append("}\n");
1104
		ICompilationUnit cu= pack1.createCompilationUnit("Func2.java", buf.toString(), false, null);
1105
1106
		int offset= buf.toString().indexOf("public void");
1107
		AssistContext context= getCorrectionContext(cu, offset, 0);
1108
		assertNoErrors(context);
1109
		List proposals= collectAssists(context, false);
1110
1111
		assertNumberOfProposals(proposals, 1);
1112
		assertCorrectLabels(proposals);
1113
1114
		buf= new StringBuffer();
1115
		buf.append("package test1;\n");
1116
		buf.append("import test1.Func2.En.COLOR;\n");
1117
		buf.append("@FunctionalInterface\n");
1118
		buf.append("interface Func2 {\n");
1119
		buf.append("    enum En {\n");
1120
		buf.append("        A, B;\n");
1121
		buf.append("        enum COLOR {\n");
1122
		buf.append("            D, E\n");
1123
		buf.append("        }\n");
1124
		buf.append("    }\n");
1125
		buf.append("\n");
1126
		buf.append("    void foo();\n");
1127
		buf.append("\n");
1128
		buf.append("    String NAME = \"\";\n");
1129
		buf.append("\n");
1130
		buf.append("    static String staticName() {\n");
1131
		buf.append("        return NAME;\n");
1132
		buf.append("    }\n");
1133
		buf.append("}\n");
1134
		buf.append("\n");
1135
		buf.append("class Test2 {\n");
1136
		buf.append("    void bar() {\n");
1137
		buf.append("        Func2 f = () -> System.out.println(COLOR.D);\n");
1138
		buf.append("    }\n");
1139
		buf.append("}\n");
1140
		String expected1= buf.toString();
1141
1142
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1143
	}
1144
1145
	// Bug 421479
1146
	public void testConvertToLambda22() throws Exception {
1147
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1148
		StringBuffer buf= new StringBuffer();
1149
		buf.append("package test1;\n");
1150
		buf.append("import test1.Func2.En.*;\n");
1151
		buf.append("@FunctionalInterface\n");
1152
		buf.append("interface Func2 {\n");
1153
		buf.append("    enum En {\n");
1154
		buf.append("        A, B;\n");
1155
		buf.append("        enum COLOR {\n");
1156
		buf.append("            D, E\n");
1157
		buf.append("        }\n");
1158
		buf.append("    }\n");
1159
		buf.append("\n");
1160
		buf.append("    void foo();\n");
1161
		buf.append("\n");
1162
		buf.append("    String NAME = \"\";\n");
1163
		buf.append("\n");
1164
		buf.append("    static String staticName() {\n");
1165
		buf.append("        return NAME;\n");
1166
		buf.append("    }\n");
1167
		buf.append("}\n");
1168
		buf.append("\n");
1169
		buf.append("class Test2 {\n");
1170
		buf.append("    void bar() {\n");
1171
		buf.append("        Func2 f = new Func2() {\n");
1172
		buf.append("            @Override\n");
1173
		buf.append("            public void foo() {\n");
1174
		buf.append("                System.out.println(COLOR.D);\n");
1175
		buf.append("            }\n");
1176
		buf.append("        };\n");
1177
		buf.append("    }\n");
1178
		buf.append("}\n");
1179
		ICompilationUnit cu= pack1.createCompilationUnit("Func2.java", buf.toString(), false, null);
1180
1181
		int offset= buf.toString().indexOf("public void");
1182
		AssistContext context= getCorrectionContext(cu, offset, 0);
1183
		assertNoErrors(context);
1184
		List proposals= collectAssists(context, false);
1185
1186
		assertNumberOfProposals(proposals, 1);
1187
		assertCorrectLabels(proposals);
1188
1189
		buf= new StringBuffer();
1190
		buf.append("package test1;\n");
1191
		buf.append("import test1.Func2.En.*;\n");
1192
		buf.append("@FunctionalInterface\n");
1193
		buf.append("interface Func2 {\n");
1194
		buf.append("    enum En {\n");
1195
		buf.append("        A, B;\n");
1196
		buf.append("        enum COLOR {\n");
1197
		buf.append("            D, E\n");
1198
		buf.append("        }\n");
1199
		buf.append("    }\n");
1200
		buf.append("\n");
1201
		buf.append("    void foo();\n");
1202
		buf.append("\n");
1203
		buf.append("    String NAME = \"\";\n");
1204
		buf.append("\n");
1205
		buf.append("    static String staticName() {\n");
1206
		buf.append("        return NAME;\n");
1207
		buf.append("    }\n");
1208
		buf.append("}\n");
1209
		buf.append("\n");
1210
		buf.append("class Test2 {\n");
1211
		buf.append("    void bar() {\n");
1212
		buf.append("        Func2 f = () -> System.out.println(COLOR.D);\n");
1213
		buf.append("    }\n");
1214
		buf.append("}\n");
1215
		String expected1= buf.toString();
1216
1217
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1218
	}
1219
1220
	// Bug 421479
1221
	public void testConvertToLambda23() throws Exception {
1222
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1223
		StringBuffer buf= new StringBuffer();
1224
		buf.append("package test1;\n");
1225
		buf.append("@FunctionalInterface\n");
1226
		buf.append("interface Func {\n");
1227
		buf.append("    class C {\n");
1228
		buf.append("        static  class CIn { static int i= 0; }        \n");
1229
		buf.append("        static String NAME = \"\";\n");
1230
		buf.append("    }\n");
1231
		buf.append("    void foo();\n");
1232
		buf.append("}\n");
1233
		buf.append("\n");
1234
		buf.append("class Test {\n");
1235
		buf.append("    static class C {\n");
1236
		buf.append("        static  class CIn { static int i= 1; }        \n");
1237
		buf.append("        static String NAME = \"\";\n");
1238
		buf.append("    }\n");
1239
		buf.append("    void bar() {\n");
1240
		buf.append("        Func f = new Func() {\n");
1241
		buf.append("            @Override\n");
1242
		buf.append("            public void foo() {\n");
1243
		buf.append("                System.out.println(C.CIn.i);\n");
1244
		buf.append("                System.out.println(C.NAME);\n");
1245
		buf.append("            }\n");
1246
		buf.append("        };\n");
1247
		buf.append("    }\n");
1248
		buf.append("}\n");
1249
		ICompilationUnit cu= pack1.createCompilationUnit("Func.java", buf.toString(), false, null);
1250
1251
		int offset= buf.toString().indexOf("public void");
1252
		AssistContext context= getCorrectionContext(cu, offset, 0);
1253
		assertNoErrors(context);
1254
		List proposals= collectAssists(context, false);
1255
1256
		assertNumberOfProposals(proposals, 1);
1257
		assertCorrectLabels(proposals);
1258
1259
		buf= new StringBuffer();
1260
		buf.append("package test1;\n");
1261
		buf.append("@FunctionalInterface\n");
1262
		buf.append("interface Func {\n");
1263
		buf.append("    class C {\n");
1264
		buf.append("        static  class CIn { static int i= 0; }        \n");
1265
		buf.append("        static String NAME = \"\";\n");
1266
		buf.append("    }\n");
1267
		buf.append("    void foo();\n");
1268
		buf.append("}\n");
1269
		buf.append("\n");
1270
		buf.append("class Test {\n");
1271
		buf.append("    static class C {\n");
1272
		buf.append("        static  class CIn { static int i= 1; }        \n");
1273
		buf.append("        static String NAME = \"\";\n");
1274
		buf.append("    }\n");
1275
		buf.append("    void bar() {\n");
1276
		buf.append("        Func f = () -> {\n");
1277
		buf.append("            System.out.println(test1.Func.C.CIn.i);\n");
1278
		buf.append("            System.out.println(Func.C.NAME);\n");
1279
		buf.append("        };\n");
1280
		buf.append("    }\n");
1281
		buf.append("}\n");
1282
		String expected1= buf.toString();
1283
1284
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1285
	}
1286
1287
	// Bug 421479
1288
	public void testConvertToLambda24() throws Exception {
1289
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1290
		StringBuffer buf= new StringBuffer();
1291
		buf.append("package test1;\n");
1292
		buf.append("@FunctionalInterface\n");
1293
		buf.append("interface Func {\n");
1294
		buf.append("    class C {\n");
1295
		buf.append("        static  class CIn { static int i= 0; }        \n");
1296
		buf.append("    }\n");
1297
		buf.append("    void foo();\n");
1298
		buf.append("}\n");
1299
		buf.append("\n");
1300
		buf.append("class Test extends TT {\n");
1301
		buf.append("    static class C {\n");
1302
		buf.append("        static  class CIn { static int i= 1; }        \n");
1303
		buf.append("    }\n");
1304
		buf.append("    void bar() {\n");
1305
		buf.append("        test1.Func f = new test1.Func() {\n");
1306
		buf.append("            @Override\n");
1307
		buf.append("            public void foo() {\n");
1308
		buf.append("                System.out.println(C.CIn.i); // [1]\n");
1309
		buf.append("            }\n");
1310
		buf.append("        };\n");
1311
		buf.append("    }\n");
1312
		buf.append("}\n");
1313
		buf.append("\n");
1314
		buf.append("class TT {\n");
1315
		buf.append("    class Func {\n");
1316
		buf.append("    }\n");
1317
		buf.append("}\n");
1318
		ICompilationUnit cu= pack1.createCompilationUnit("Func.java", buf.toString(), false, null);
1319
1320
		int offset= buf.toString().indexOf("public void");
1321
		AssistContext context= getCorrectionContext(cu, offset, 0);
1322
		assertNoErrors(context);
1323
		List proposals= collectAssists(context, false);
1324
1325
		assertNumberOfProposals(proposals, 1);
1326
		assertCorrectLabels(proposals);
1327
1328
		buf= new StringBuffer();
1329
		buf.append("package test1;\n");
1330
		buf.append("@FunctionalInterface\n");
1331
		buf.append("interface Func {\n");
1332
		buf.append("    class C {\n");
1333
		buf.append("        static  class CIn { static int i= 0; }        \n");
1334
		buf.append("    }\n");
1335
		buf.append("    void foo();\n");
1336
		buf.append("}\n");
1337
		buf.append("\n");
1338
		buf.append("class Test extends TT {\n");
1339
		buf.append("    static class C {\n");
1340
		buf.append("        static  class CIn { static int i= 1; }        \n");
1341
		buf.append("    }\n");
1342
		buf.append("    void bar() {\n");
1343
		buf.append("        test1.Func f = () -> System.out.println(test1.Func.C.CIn.i);\n");
1344
		buf.append("    }\n");
1345
		buf.append("}\n");
1346
		buf.append("\n");
1347
		buf.append("class TT {\n");
1348
		buf.append("    class Func {\n");
1349
		buf.append("    }\n");
1350
		buf.append("}\n");
1351
		String expected1= buf.toString();
1352
1353
		assertExpectedExistInProposals(proposals, new String[] { expected1 });
1354
	}
1355
1356
	// Bug 421479
1357
	public void testConvertToLambda25() throws Exception {
1358
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1359
		StringBuffer buf= new StringBuffer();
1360
		buf.append("package test1;\n");
1361
		buf.append("@FunctionalInterface\n");
1362
		buf.append("interface Func2 {\n");
1363
		buf.append("    enum En {\n");
1364
		buf.append("        A, B\n");
1365
		buf.append("    }\n");
1366
		buf.append("\n");
1367
		buf.append("    void foo();\n");
1368
		buf.append("\n");
1369
		buf.append("    String NAME = \"\";\n");
1370
		buf.append("\n");
1371
		buf.append("    static String staticName() {\n");
1372
		buf.append("        return NAME;\n");
1373
		buf.append("    }\n");
1374
		buf.append("}\n");
1375
		buf.append("\n");
1376
		buf.append("class Test2 {\n");
1377
		buf.append("    void bar() {\n");
1378
		buf.append("        Func2 f = new Func2() {\n");
1379
		buf.append("            @Override\n");
1380
		buf.append("            public void foo() {\n");
1381
		buf.append("                foo();\n");
1382
		buf.append("            }\n");
1383
		buf.append("        };\n");
1384
		buf.append("    }\n");
1385
		buf.append("}\n");
1386
		ICompilationUnit cu= pack1.createCompilationUnit("Func2.java", buf.toString(), false, null);
1387
1388
		int offset= buf.toString().indexOf("public void");
1389
		AssistContext context= getCorrectionContext(cu, offset, 0);
1390
		assertNoErrors(context);
1391
		List proposals= collectAssists(context, false);
1392
1393
		assertNumberOfProposals(proposals, 0);
1394
	}
1395
1396
	// Bug 421479
1397
	public void testConvertToLambda26() throws Exception {
1398
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1399
		StringBuffer buf= new StringBuffer();
1400
		buf.append("package test1;\n");
1401
		buf.append("import java.util.function.Consumer;\n");
1402
		buf.append("\n");
1403
		buf.append("public class Test {\n");
1404
		buf.append("    static void run(Consumer<Integer> consumer) {\n");
1405
		buf.append("        System.out.println(\"consumer\");\n");
1406
		buf.append("    }\n");
1407
		buf.append("    static {\n");
1408
		buf.append("        run(new Consumer<Integer>() {\n");
1409
		buf.append("            @Override\n");
1410
		buf.append("            public void accept(Integer integer) {\n");
1411
		buf.append("                System.out.println(andThen(null));\n");
1412
		buf.append("            }\n");
1413
		buf.append("        });\n");
1414
		buf.append("    }\n");
1415
		buf.append("}\n");
1416
		ICompilationUnit cu= pack1.createCompilationUnit("Test.java", buf.toString(), false, null);
1417
1418
		int offset= buf.toString().indexOf("public void");
1419
		AssistContext context= getCorrectionContext(cu, offset, 0);
1420
		assertNoErrors(context);
1421
		List proposals= collectAssists(context, false);
1422
1423
		assertNumberOfProposals(proposals, 0);
1424
	}
1425
933
	public void testConvertToLambdaAmbiguousOverridden() throws Exception {
1426
	public void testConvertToLambdaAmbiguousOverridden() throws Exception {
934
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
1427
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
935
		StringBuffer buf= new StringBuffer();
1428
		StringBuffer buf= new StringBuffer();
(-)core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java (-5 / +114 lines)
Lines 21-26 Link Here
21
21
22
import org.eclipse.text.edits.TextEditGroup;
22
import org.eclipse.text.edits.TextEditGroup;
23
23
24
import org.eclipse.jdt.core.IImportDeclaration;
25
import org.eclipse.jdt.core.JavaModelException;
24
import org.eclipse.jdt.core.dom.AST;
26
import org.eclipse.jdt.core.dom.AST;
25
import org.eclipse.jdt.core.dom.ASTNode;
27
import org.eclipse.jdt.core.dom.ASTNode;
26
import org.eclipse.jdt.core.dom.ASTVisitor;
28
import org.eclipse.jdt.core.dom.ASTVisitor;
Lines 36-46 Link Here
36
import org.eclipse.jdt.core.dom.IBinding;
38
import org.eclipse.jdt.core.dom.IBinding;
37
import org.eclipse.jdt.core.dom.IMethodBinding;
39
import org.eclipse.jdt.core.dom.IMethodBinding;
38
import org.eclipse.jdt.core.dom.ITypeBinding;
40
import org.eclipse.jdt.core.dom.ITypeBinding;
41
import org.eclipse.jdt.core.dom.IVariableBinding;
39
import org.eclipse.jdt.core.dom.LambdaExpression;
42
import org.eclipse.jdt.core.dom.LambdaExpression;
40
import org.eclipse.jdt.core.dom.MethodDeclaration;
43
import org.eclipse.jdt.core.dom.MethodDeclaration;
41
import org.eclipse.jdt.core.dom.MethodInvocation;
44
import org.eclipse.jdt.core.dom.MethodInvocation;
45
import org.eclipse.jdt.core.dom.Name;
46
import org.eclipse.jdt.core.dom.QualifiedName;
42
import org.eclipse.jdt.core.dom.ReturnStatement;
47
import org.eclipse.jdt.core.dom.ReturnStatement;
43
import org.eclipse.jdt.core.dom.SimpleName;
48
import org.eclipse.jdt.core.dom.SimpleName;
49
import org.eclipse.jdt.core.dom.SimpleType;
44
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
50
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
45
import org.eclipse.jdt.core.dom.Statement;
51
import org.eclipse.jdt.core.dom.Statement;
46
import org.eclipse.jdt.core.dom.SuperFieldAccess;
52
import org.eclipse.jdt.core.dom.SuperFieldAccess;
Lines 61-66 Link Here
61
import org.eclipse.jdt.internal.corext.dom.Bindings;
67
import org.eclipse.jdt.internal.corext.dom.Bindings;
62
import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor;
68
import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor;
63
import org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder;
69
import org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder;
70
import org.eclipse.jdt.internal.corext.dom.TypeRules;
64
import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite;
71
import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite;
65
import org.eclipse.jdt.internal.corext.refactoring.structure.ImportRemover;
72
import org.eclipse.jdt.internal.corext.refactoring.structure.ImportRemover;
66
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
73
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
Lines 71-76 Link Here
71
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
78
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
72
79
73
public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix {
80
public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix {
81
82
	private static final class InterfaceAccessQualifier extends HierarchicalASTVisitor {
83
84
		private ClassInstanceCreation classInstanceCreation;
85
86
		private ITypeBinding typeBinding;
87
88
		private CompilationUnitRewrite cuRewrite;
89
		
90
		private TextEditGroup categorizedGroup;
91
92
		public InterfaceAccessQualifier(CompilationUnitRewrite rewrite, ClassInstanceCreation classInstance, TextEditGroup group) {
93
			this.classInstanceCreation= classInstance;
94
			this.typeBinding= classInstanceCreation.getType().resolveBinding();
95
			this.cuRewrite= rewrite;
96
			this.categorizedGroup= group;
97
		}
98
99
		private boolean isTypeImported(String qualifiedName) {
100
			IImportDeclaration[] availableImports= null;
101
			try {
102
				availableImports= cuRewrite.getCu().getImports();
103
			} catch (JavaModelException e) {
104
				// ignore
105
			}
106
			for (IImportDeclaration iImportDeclaration : availableImports) {
107
				String elementName= iImportDeclaration.getElementName();
108
				if (iImportDeclaration.isOnDemand()) {
109
					elementName= elementName.substring(0, elementName.indexOf(".*")); //$NON-NLS-1$
110
				}
111
				if (qualifiedName.startsWith(elementName)) {
112
					return true;
113
				}
114
			}
115
			return false;
116
		}
117
118
		@Override
119
		public boolean visit(SimpleName node) {
120
			IBinding resolveBinding= node.resolveBinding();
121
			ITypeBinding declaringClass= null;
122
			if (resolveBinding instanceof IVariableBinding) {
123
				declaringClass= ((IVariableBinding) resolveBinding).getDeclaringClass();
124
			} else if (resolveBinding instanceof ITypeBinding) {
125
				declaringClass= ((ITypeBinding) resolveBinding).getDeclaringClass();
126
			}
127
			if (declaringClass != null && (Bindings.equals(typeBinding, declaringClass) || TypeRules.canAssign(typeBinding, declaringClass))) {
128
				if (!isTypeImported(declaringClass.getQualifiedName())) {
129
					ASTRewrite rewrite= cuRewrite.getASTRewrite();
130
					String qualifier= typeBinding.getErasure().getName();
131
					AST ast= cuRewrite.getAST();
132
					SimpleName simpleName= ast.newSimpleName(node.getIdentifier());
133
					rewrite.set(node, SimpleName.IDENTIFIER_PROPERTY, ast.newQualifiedName(ast.newName(qualifier), simpleName).getFullyQualifiedName(), categorizedGroup);
134
				}
135
			}
136
			return true;
137
		}
138
139
		@Override
140
		public boolean visit(QualifiedName node) {
141
			Name qualifier= node.getQualifier();
142
			if (qualifier instanceof SimpleName) {
143
				if (Bindings.equals(typeBinding, qualifier.resolveBinding()))
144
					return false;
145
				return true;
146
			}
147
			// Ignore if already qualified with the functional interface
148
			IBinding qualifierBinding= ASTNodes.getLeftMostSimpleName(qualifier).resolveBinding();
149
			if (qualifierBinding == null || Bindings.equals(typeBinding, qualifierBinding)) {
150
				return false;
151
			}
152
153
			IBinding resolveBinding= node.resolveBinding();
154
			ITypeBinding declaringClass= null;
155
			if (resolveBinding instanceof IVariableBinding) {
156
				declaringClass= ((IVariableBinding) resolveBinding).getDeclaringClass();
157
			} else if (resolveBinding instanceof ITypeBinding) {
158
				declaringClass= ((ITypeBinding) resolveBinding).getDeclaringClass();
159
			}
160
			while (declaringClass != null) {
161
				if (Bindings.equals(typeBinding, declaringClass) && qualifierBinding instanceof ITypeBinding) {
162
					ImportRewrite importRewrite= cuRewrite.getImportRewrite();
163
					ImportRewriteContext importRewriteContext= new ContextSensitiveImportRewriteContext(classInstanceCreation, importRewrite);
164
					Type addImport= importRewrite.addImport((ITypeBinding) qualifierBinding, cuRewrite.getAST(), importRewriteContext);
165
					ImportRemover importRemover= cuRewrite.getImportRemover();
166
					importRemover.registerAddedImports(addImport);
167
					if (addImport instanceof SimpleType) {
168
						Name qualifiedName= ((SimpleType) addImport).getName();
169
						if (qualifiedName instanceof QualifiedName && qualifier instanceof QualifiedName) {
170
							ASTRewrite rewrite= cuRewrite.getASTRewrite();
171
							rewrite.set(qualifier, QualifiedName.QUALIFIER_PROPERTY, qualifiedName, categorizedGroup);
172
						}
173
					}
174
					return false;
175
				}
176
				declaringClass= declaringClass.getDeclaringClass();
177
			}
178
			return false;
179
		}
180
	}
74
181
75
	private static final class FunctionalAnonymousClassesFinder extends ASTVisitor {
182
	private static final class FunctionalAnonymousClassesFinder extends ASTVisitor {
76
183
Lines 176-183 Link Here
176
		@Override
283
		@Override
177
		public boolean visit(MethodInvocation node) {
284
		public boolean visit(MethodInvocation node) {
178
			IMethodBinding binding= node.resolveMethodBinding();
285
			IMethodBinding binding= node.resolveMethodBinding();
179
			if (binding != null && !JdtFlags.isStatic(binding) && node.getExpression() == null
286
			if (binding != null
180
					&& Bindings.isSuperType(binding.getDeclaringClass(), fFunctionalInterface, false))
287
					&& ((!JdtFlags.isStatic(binding) && node.getExpression() == null && Bindings.isSuperType(binding.getDeclaringClass(), fFunctionalInterface, true))
288
					|| (Bindings.equals(binding, fMethodDeclaration.resolveBinding()))))
181
				throw new AbortSearchException();
289
				throw new AbortSearchException();
182
			return true;
290
			return true;
183
		}
291
		}
Lines 250-257 Link Here
250
						}
358
						}
251
					}
359
					}
252
				}
360
				}
253
				//TODO: Bug 421479: [1.8][clean up][quick assist] convert anonymous to lambda must consider lost scope of interface
361
				
254
//				lambdaBody.accept(new InterfaceAccessQualifier(rewrite, classInstanceCreation.getType().resolveBinding())); //TODO: maybe need a separate ASTRewrite and string placeholder
362
				// Qualify the lost scope of the interface
363
				lambdaBody.accept(new InterfaceAccessQualifier(cuRewrite, classInstanceCreation, group));
255
				
364
				
256
				lambdaExpression.setBody(rewrite.createCopyTarget(lambdaBody));
365
				lambdaExpression.setBody(rewrite.createCopyTarget(lambdaBody));
257
				Expression replacement= lambdaExpression;
366
				Expression replacement= lambdaExpression;
Lines 547-553 Link Here
547
			return methodBinding.getReturnType().getFunctionalInterfaceMethod() != null;
656
			return methodBinding.getReturnType().getFunctionalInterfaceMethod() != null;
548
		}
657
		}
549
		
658
		
550
		//TODO: should also check whether variable is of a functional type 
659
		//TODO: should also check whether variable is of a functional type
551
		return locationInParent == SingleVariableDeclaration.INITIALIZER_PROPERTY
660
		return locationInParent == SingleVariableDeclaration.INITIALIZER_PROPERTY
552
				|| locationInParent == VariableDeclarationFragment.INITIALIZER_PROPERTY
661
				|| locationInParent == VariableDeclarationFragment.INITIALIZER_PROPERTY
553
				|| locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY
662
				|| locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY

Return to bug 421479