From 378bd98996f5b8d44596c24138b0524c139622d0 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 11 Jul 2018 13:18:42 +0200 Subject: [PATCH] [java] improves mandatory module path detection; more package accessibility tests --- .../psi/impl/JavaPlatformModuleSystem.kt | 32 ++++++++++-------- .../codeInsight/jigsaw/lib-multi-release.jar | Bin 3250 -> 3284 bytes .../completion/ModuleCompletionTest.kt | 6 ++-- .../daemon/ModuleHighlightingTest.kt | 19 +++++++++++ java/mockJDK-1.9/jre/lib/java.se.jar | Bin 0 -> 584 bytes java/mockJDK-1.9/jre/lib/javax.doomed.jar | Bin 0 -> 1110 bytes java/mockJDK-1.9/jre/lib/rt.jar | Bin 4231867 -> 4232530 bytes 7 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 java/mockJDK-1.9/jre/lib/java.se.jar create mode 100644 java/mockJDK-1.9/jre/lib/javax.doomed.jar diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt b/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt index 6dd7bf9b8e4c..b93ec831eda5 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPlatformModuleSystem.kt @@ -13,8 +13,9 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.JdkOrderEntry +import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ProjectFileIndex -import com.intellij.openapi.vfs.jrt.JrtFileSystem import com.intellij.psi.* import com.intellij.psi.impl.light.LightJavaModule import com.intellij.psi.impl.source.PsiJavaModuleReference @@ -81,14 +82,24 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { return null } - if (useModule == null && targetModule.containingFile?.virtualFile?.fileSystem !is JrtFileSystem) { - return null // a target is not on the mandatory module path - } - val targetName = targetModule.name val useName = useModule?.name ?: "ALL-UNNAMED" val module = place.virtualFile?.let { ProjectFileIndex.getInstance(place.project).getModuleForFile(it) } + if (useModule == null) { + val origin = targetModule.containingFile?.virtualFile + if (origin == null || module == null || ModuleRootManager.getInstance(module).fileIndex.getOrderEntryForFile(origin) !is JdkOrderEntry) { + return null // a target is not on the mandatory module path + } + + val root = PsiJavaModuleReference.resolve(place, "java.se", false) + if (!(root == null || JavaModuleGraphUtil.reads(root, targetModule) || inAddedModules(module, targetName))) { + return if (quick) ERR else ErrorWithFixes( + JavaErrorMessages.message("module.access.not.in.graph", packageName, targetName), + listOf(AddModulesOptionFix(module, targetName))) + } + } + if (!(targetModule is LightJavaModule || JavaModuleGraphUtil.exports(targetModule, packageName, useModule) || module != null && inAddedExports(module, targetName, packageName, useName))) { @@ -105,16 +116,7 @@ class JavaPlatformModuleSystem : JavaModuleSystemEx { } } - if (useModule == null) { - if (!targetName.startsWith("java.")) return null - val root = PsiJavaModuleReference.resolve(place, "java.se", false) - if (root == null || JavaModuleGraphUtil.reads(root, targetModule)) return null - if (module != null && inAddedModules(module, targetName)) return null - val fixes = if (quick || module == null) emptyList() else listOf(AddModulesOptionFix(module, targetName)) - return if (quick) ERR else ErrorWithFixes(JavaErrorMessages.message("module.access.not.in.graph", packageName, targetName), fixes) - } - - if (!(targetName == PsiJavaModule.JAVA_BASE || JavaModuleGraphUtil.reads(useModule, targetModule))) { + if (useModule != null && !(targetName == PsiJavaModule.JAVA_BASE || JavaModuleGraphUtil.reads(useModule, targetModule))) { return when { quick -> ERR PsiNameHelper.isValidModuleName(targetName, useModule) -> ErrorWithFixes( diff --git a/java/java-tests/testData/codeInsight/jigsaw/lib-multi-release.jar b/java/java-tests/testData/codeInsight/jigsaw/lib-multi-release.jar index 261a2584d725e9ac5022eb9a4633d2ab9ba18ee7..81a0acfc9e75c07502b60d57ba65fdca82b89829 100644 GIT binary patch delta 860 zcmdlac}3DCz?+#xgn@yBgW+w{F)s!nU;+_9z{$YE;OiRVsO#zHrvL900|PSys^b0I zZ~lw~DvX*KQa16{T}Fn<3pm9mPheD>{DJYOG|bqJX|H^~M>ob!0;=2%#A*yOllvLP zCOdEmYK4YyGB7(laf!|V;?fFk21b?_%nS@*!uo6ebvrgTwqUlnGB&@-p3E9C(+!x- zm6=yBo!2<8lY^OGnb~|&k{jE>IcHS%-nleqlF!~nSLR$flC+?3j)L-+Ne6P?J^2&! z_e$51J56)008MgZlSp845;%G00Mn9GiHL)X9J(7<-Dosnk5Of2m~6lzH8Grb@_Xi1 zphpb2#U~%+l9(*d%`tfm3vSP-0zGqqRgFZCMAOhClbhIrB|y=+4H%tCKla2w1crGe zBLjmnke>{LUrg?0l$gxO zsl_DCIJu8eda?(Q83bag!gVg-RAib65>f`nwzy7!HzSiAGbABl#<&E~ZU|V?c$^8S zNgNdY5}_fikmyH?`pJP@T1-2cC!c2(n>?9Ii}Cg3eO#_giY$}&b4dZCL;xH?icIk^ z0Z<&_cY-PdvJ5^{>c{@e`>RHOnIx& z{s5>cf{_7e8_a2e)BRDLrUuog&n3cV{Wbr(9UB{4Fk4<38{cF`HjVJ*2F&8h%-u`# zv;w9`dnzh7C-|jJip$IN^IR4enB|w1WOzZtZ$jB#6@}f6jg1o-*=95dxEL94V8}FN z3)`S^L27|k*$gGHZ;u?mR9Xvk&tf2+tjHoY`7-k)uvbo_dBq&;B+<#m+{%-;usi~K zW$V-_??GM($LkeUus$^`-Uy?OHzv2R1xtV;V;hszz(8B-# diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt index 4b88ce5a0211..1396276854c7 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/ModuleCompletionTest.kt @@ -32,7 +32,8 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() { fun testStatementsUnambiguous() = complete("module M { requires X; ex }", "module M { requires X; exports }") fun testRequiresBare() = - variants("module M { requires ", "transitive", "static", "M2", "java.base", "lib.multi.release", "lib.named", "lib.auto", "lib.claimed") + variants("module M { requires ", + "transitive", "static", "M2", "java.base", "java.se", "javax.doomed", "lib.multi.release", "lib.named", "lib.auto", "lib.claimed") fun testRequiresTransitive() = complete("module M { requires tr }", "module M { requires transitive }") fun testRequiresSimpleName() = complete("module M { requires M }", "module M { requires M2; }") fun testRequiresQualifiedName() = complete("module M { requires lib.m }", "module M { requires lib.multi.release; }") @@ -42,7 +43,8 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() { fun testExportsQualified() = variants("module M { exports pkg. }", "main", "other", "empty") fun testExportsQualifiedUnambiguous() = complete("module M { exports pkg.o }", "module M { exports pkg.other. }") fun testExportsTo() = complete("module M { exports pkg.other }", "module M { exports pkg.other to }") - fun testExportsToList() = variants("module M { exports pkg.other to }", "M2", "java.base", "lib.multi.release", "lib.named") + fun testExportsToList() = + variants("module M { exports pkg.other to }", "M2", "java.base", "java.se", "javax.doomed", "lib.multi.release", "lib.named") fun testExportsToUnambiguous() = complete("module M { exports pkg.other to M }", "module M { exports pkg.other to M2 }") fun testUsesPrefixed() = complete("module M { uses p }", "module M { uses pkg. }") diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt index 7c3ce35697bb..f63e32bddedd 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleHighlightingTest.kt @@ -295,6 +295,25 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { highlight("test.java", checkFileText, checkFileInTests) } + fun testPrivateJdkPackage() { + addFile("module-info.java", "module M { }") + highlight("test.java", """ + import jdk.internal.*; + """.trimIndent()) + } + + fun testPrivateJdkPackageFromUnnamed() { + highlight("test.java", """ + import jdk.internal.*; + """.trimIndent()) + } + + fun testNonRootJdkModule() { + highlight("test.java", """ + import javax.doomed.*; + """.trimIndent()) + } + fun testLinearModuleGraphBug() { addFile("module-info.java", "module M6 { requires M7; }", M6) addFile("module-info.java", "module M7 { }", M7) diff --git a/java/mockJDK-1.9/jre/lib/java.se.jar b/java/mockJDK-1.9/jre/lib/java.se.jar new file mode 100644 index 0000000000000000000000000000000000000000..779149fee84f9aabbfcb2dc181bf2f62850b3446 GIT binary patch literal 584 zcmWIWW@Zs#;Nak3xSa9IhXDz2GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>gu43Vg zcp-U2dX}VS#t(5-wdYH;ES`&tJ`q=)#&9+JQ_;sFMzAZ^PT#Q61!#vW5F=c1H4W7Z zf#zCO?bz7Zg4y!Q*!bMo);;)hY0;CA?PunMxUn_f z`7`CxoRGU`_H3!yyXMFy7dJMu_ze>bn3o$ciz_p)UOKOF9;Y(1`6Mqlwz3IPdy^J$ z&PfOhN-E4^W@c7q<}qMY>_|yVV7!#XvnC;M!Al-4o;L=rU?)4>YtStLI%pQy$&5@Q z45;A_3sg|JqXKw9f?^@S8&xZENPt2e0c?RxxK^Y%KsEssV#p2yg%|=H1~M_iFTk6X Q4Wxt_2=@T#GDZ*&0Est{e*gdg literal 0 HcmV?d00001 diff --git a/java/mockJDK-1.9/jre/lib/javax.doomed.jar b/java/mockJDK-1.9/jre/lib/javax.doomed.jar new file mode 100644 index 0000000000000000000000000000000000000000..d97bcefb813f240aecb52ec5d8fe5604bd87753e GIT binary patch literal 1110 zcmWIWW@Zs#;Nak3$SZj1!+-=h8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1gxddtWCb%&Pt)*H8aoMcVBF)uAs`TdGF z)2ptByjj-W_pa~Jyre}w{_E?GF#J9*k+kH#anJUsvw`m$A3dBeZx4!}`T0)$w}Jjv zV1$GW7Xt$@&d@`K7pNjDu`IDdKP5juH#J2ccOc54D|G?ua0Z1XBt)&h=3lpCV`B?u zi_>FEW78{R%PV7(b7M1`eP+)YA!|3bG~TlYZfs)D|4a#SW2>8gW>3ieOLvxBSv29u z5}5@Y;RSV>fkmsL)jE_POqxG`_N+&9CP&1qnLagQ+KIyl4jnjkLV+9~i8RriiShaO-W1(`yELo3D zjjS^pRoEw_B|TsPryThWWm+qNUb+ax0p5&EA`Ga>AC|U3$sZNK(=#YDpld}=kf6km z0JcCTTq{ymKsEssJ;)IUO1KDc7|6s(#vtun47g(#q5Uo}C7{JM!rLI5k%I&j+X%n` a3=I^m7;zuq&B_K+&kBUjK#Tr@!w&%2KTMVY literal 0 HcmV?d00001 diff --git a/java/mockJDK-1.9/jre/lib/rt.jar b/java/mockJDK-1.9/jre/lib/rt.jar index e5ffffef95be0ad1b828bbb6b281c46f3289b363..6c9262e69d5acda1cc10d7a9ca5216b082befa9e 100644 GIT binary patch delta 844 zcmdnJw2A4`swSp}7RDB)7UmX~7Sq57TFfL7Wo#17R45&7UdR|7S$HD7WEd57R?r|7VQ?D7Tp%T z7X2237Q+^!7ULF^7Sk597V{R17Rwf^E!J%R>zP@&7(l=+`n3<30VP-%WEiqivh_nl zI2o9Y&$>oC1952uHv=Qf3uXoeFcIL5OE)i6cV=EmYEfQd4o+k0L56|M5dqrE0d_^x z<gsy-r9{VjrXj98=KhkKT|^7*y`q=*%Pw=(w!w&7EL&^L}md;ctKreV9}~* zwGQQ1QzyNh89pg$%JdnJ=S+@>Su=fV#IzHK4;(sh>V(4Vsgu^u=bU=gJ^bVe1%{y2 z^C!=kzV7|}DN|>~99nSV085DwhXIq~1p$SVY)?)${p8_U6LnisLdd*n>CHwJ>4*uE z9z_h9YHWTC(*p}_WZD(}TLZBT5ZeN=-FAil_U)7F8JXmmamAMeH0A^t-a4}Uw}!?Z zD_j#bWF)RwMYl)>mhM>DK%UL# Q%;#J_g@s`%gAI@e0G6Tl0RR91 delta 172 zcmWN^HxdC+0Dxhh-DTw*R?a!+Y{qpQ!kB-@0TgP5M)zi@+`@(Mb>HW467Ty-9I+y> zp`fB+$AOL$7j8Uw@!=;xkPu-aM2Qh6fkBcKX)sZpmvlNN0{bm`G& xz>pDRCQO+zXYpKW->cZK3{$R5xi;m-l-rlwoiAZkv-}