mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] new module-info PSI
- PsiExportStatement is generalized into PsiPackageAccessibilityStatement - statement getters in PsiJavaModule
This commit is contained in:
@@ -303,7 +303,7 @@ public class JavaModuleInsight extends ModuleInsight {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitExportsStatement(PsiExportsStatement statement) {
|
||||
public void visitExportsStatement(PsiPackageAccessibilityStatement statement) {
|
||||
super.visitExportsStatement(statement);
|
||||
PsiJavaCodeReferenceElement reference = statement.getPackageReference();
|
||||
if (reference != null) {
|
||||
|
||||
+3
-4
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -1685,13 +1685,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitExportsStatement(PsiExportsStatement statement) {
|
||||
public void visitExportsStatement(PsiPackageAccessibilityStatement statement) {
|
||||
super.visitExportsStatement(statement);
|
||||
if (myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_9)) {
|
||||
PsiJavaModule container = (PsiJavaModule)statement.getParent();
|
||||
PsiJavaCodeReferenceElement ref = statement.getPackageReference();
|
||||
if (!myHolder.hasErrorResults()) myHolder.add(ModuleHighlightUtil.checkPackageReference(ref));
|
||||
if (!myHolder.hasErrorResults()) myHolder.addAll(ModuleHighlightUtil.checkExportTargets(statement, container));
|
||||
if (!myHolder.hasErrorResults()) myHolder.addAll(ModuleHighlightUtil.checkExportTargets(statement));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -116,7 +116,7 @@ public class JavaModuleGraphUtil {
|
||||
|
||||
private static Map<String, Set<String>> exportsMap(@NotNull PsiJavaModule source) {
|
||||
Map<String, Set<String>> map = ContainerUtil.newHashMap();
|
||||
for (PsiExportsStatement statement : source.getExports()) {
|
||||
for (PsiPackageAccessibilityStatement statement : source.getExports()) {
|
||||
String pkg = statement.getPackageName();
|
||||
List<String> targets = statement.getModuleNames();
|
||||
map.put(pkg, targets.isEmpty() ? Collections.emptySet() : ContainerUtil.newTroveSet(targets));
|
||||
|
||||
+9
-22
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -43,17 +43,13 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.annotations.PropertyKey;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static com.intellij.openapi.util.Pair.pair;
|
||||
import static com.intellij.psi.PsiJavaModule.MODULE_INFO_FILE;
|
||||
import static com.intellij.psi.SyntaxTraverser.psiTraverser;
|
||||
|
||||
public class ModuleHighlightUtil {
|
||||
@Nullable
|
||||
@@ -143,12 +139,12 @@ public class ModuleHighlightUtil {
|
||||
"module.duplicate.export", results);
|
||||
|
||||
checkDuplicateRefs(
|
||||
psiTraverser().children(module).filter(PsiUsesStatement.class),
|
||||
module.getUses(),
|
||||
st -> Optional.ofNullable(st.getClassReference()).map(ModuleHighlightUtil::refText),
|
||||
"module.duplicate.uses", results);
|
||||
|
||||
checkDuplicateRefs(
|
||||
psiTraverser().children(module).filter(PsiProvidesStatement.class),
|
||||
module.getProvides(),
|
||||
st -> Optional.of(pair(st.getInterfaceReference(), st.getImplementationReference()))
|
||||
.map(p -> p.first != null && p.second != null ? refText(p.first) + " / " + refText(p.second) : null),
|
||||
"module.duplicate.provides", results);
|
||||
@@ -176,20 +172,11 @@ public class ModuleHighlightUtil {
|
||||
static List<HighlightInfo> checkUnusedServices(@NotNull PsiJavaModule module) {
|
||||
List<HighlightInfo> results = ContainerUtil.newSmartList();
|
||||
|
||||
Set<String> exports = ContainerUtil.newTroveSet(), uses = ContainerUtil.newTroveSet();
|
||||
for (PsiElement child : psiTraverser().children(module)) {
|
||||
if (child instanceof PsiExportsStatement) {
|
||||
PsiJavaCodeReferenceElement ref = ((PsiExportsStatement)child).getPackageReference();
|
||||
if (ref != null) exports.add(refText(ref));
|
||||
}
|
||||
else if (child instanceof PsiUsesStatement) {
|
||||
PsiJavaCodeReferenceElement ref = ((PsiUsesStatement)child).getClassReference();
|
||||
if (ref != null) uses.add(refText(ref));
|
||||
}
|
||||
}
|
||||
Set<String> exports = JBIterable.from(module.getExports()).map(st -> refText(st.getPackageReference())).filter(Objects::nonNull).toSet();
|
||||
Set<String> uses = JBIterable.from(module.getUses()).map(st -> refText(st.getClassReference())).filter(Objects::nonNull).toSet();
|
||||
|
||||
Module host = findModule(module);
|
||||
for (PsiProvidesStatement statement : psiTraverser().children(module).filter(PsiProvidesStatement.class)) {
|
||||
for (PsiProvidesStatement statement : module.getProvides()) {
|
||||
PsiJavaCodeReferenceElement ref = statement.getInterfaceReference();
|
||||
if (ref != null) {
|
||||
PsiElement target = ref.resolve();
|
||||
@@ -207,7 +194,7 @@ public class ModuleHighlightUtil {
|
||||
}
|
||||
|
||||
private static String refText(PsiJavaCodeReferenceElement ref) {
|
||||
return PsiNameHelper.getQualifiedClassName(ref.getText(), true);
|
||||
return ref != null ? PsiNameHelper.getQualifiedClassName(ref.getText(), true) : null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -278,7 +265,7 @@ public class ModuleHighlightUtil {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
static List<HighlightInfo> checkExportTargets(@NotNull PsiExportsStatement statement, @NotNull PsiJavaModule container) {
|
||||
static List<HighlightInfo> checkExportTargets(@NotNull PsiPackageAccessibilityStatement statement) {
|
||||
List<HighlightInfo> results = ContainerUtil.newSmartList();
|
||||
|
||||
Set<String> targets = ContainerUtil.newTroveSet();
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -51,7 +51,7 @@ public class Java9ModuleExportsPackageToItselfInspection extends BaseJavaLocalIn
|
||||
public ExportedToSelfVisitor(ProblemsHolder holder) { myHolder = holder; }
|
||||
|
||||
@Override
|
||||
public void visitExportsStatement(PsiExportsStatement statement) {
|
||||
public void visitExportsStatement(PsiPackageAccessibilityStatement statement) {
|
||||
super.visitExportsStatement(statement);
|
||||
PsiJavaModule javaModule = PsiTreeUtil.getParentOfType(statement, PsiJavaModule.class);
|
||||
if (javaModule != null) {
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -180,7 +180,7 @@ public class Java9RedundantRequiresStatementInspection extends GlobalJavaBatchIn
|
||||
private boolean isReexported(@NotNull PsiJavaModule currentModule, @NotNull PsiJavaModule transitiveModule) {
|
||||
return StreamEx
|
||||
.of(transitiveModule.getExports().iterator())
|
||||
.map(PsiExportsStatement::getPackageName)
|
||||
.map(PsiPackageAccessibilityStatement::getPackageName)
|
||||
.nonNull()
|
||||
.filter(myImportedPackages::contains)
|
||||
.anyMatch(packageName -> JavaModuleGraphUtil.exports(transitiveModule, packageName, currentModule));
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -96,7 +96,7 @@ public class RefJavaModuleImpl extends RefElementImpl implements RefJavaModule {
|
||||
}
|
||||
}
|
||||
List<String> emptyList = Collections.emptyList();
|
||||
for (PsiExportsStatement statement : javaModule.getExports()) {
|
||||
for (PsiPackageAccessibilityStatement statement : javaModule.getExports()) {
|
||||
PsiElement element = addReference(statement.getPackageReference());
|
||||
String packageName = null;
|
||||
if (element instanceof PsiPackage) {
|
||||
@@ -142,7 +142,7 @@ public class RefJavaModuleImpl extends RefElementImpl implements RefJavaModule {
|
||||
@NotNull
|
||||
private static Map<String, List<String>> getPackagesExportedByModule(@NotNull PsiJavaModule javaModule) {
|
||||
Map<String, List<String>> exportedPackages = new THashMap<>();
|
||||
for (PsiExportsStatement statement : javaModule.getExports()) {
|
||||
for (PsiPackageAccessibilityStatement statement : javaModule.getExports()) {
|
||||
String packageName = statement.getPackageName();
|
||||
if (packageName != null) {
|
||||
exportedPackages.put(packageName, statement.getModuleNames());
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -108,7 +108,7 @@ class JavaModuleCompletion {
|
||||
|
||||
private static void addCodeReferences(PsiElement context, Consumer<LookupElement> result, CompletionResultSet resultSet) {
|
||||
PsiElement statement = context.getParent();
|
||||
if (statement instanceof PsiExportsStatement) {
|
||||
if (statement instanceof PsiPackageAccessibilityStatement) {
|
||||
Module module = ModuleUtilCore.findModuleForPsiElement(context);
|
||||
PsiPackage topPackage = JavaPsiFacade.getInstance(context.getProject()).findPackage("");
|
||||
if (module != null && topPackage != null) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -403,7 +403,11 @@ public abstract class JavaElementVisitor extends PsiElementVisitor {
|
||||
visitModuleStatement(statement);
|
||||
}
|
||||
|
||||
public void visitExportsStatement(PsiExportsStatement statement) {
|
||||
public void visitExportsStatement(PsiPackageAccessibilityStatement statement) {
|
||||
visitModuleStatement(statement);
|
||||
}
|
||||
|
||||
public void visitOpensStatement(PsiPackageAccessibilityStatement statement) {
|
||||
visitModuleStatement(statement);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -32,5 +32,8 @@ public interface PsiJavaModule extends NavigatablePsiElement, PsiNamedElement, P
|
||||
@NotNull String getModuleName();
|
||||
|
||||
@NotNull Iterable<PsiRequiresStatement> getRequires();
|
||||
@NotNull Iterable<PsiExportsStatement> getExports();
|
||||
@NotNull Iterable<PsiPackageAccessibilityStatement> getExports();
|
||||
@NotNull Iterable<PsiPackageAccessibilityStatement> getOpens();
|
||||
@NotNull Iterable<PsiUsesStatement> getUses();
|
||||
@NotNull Iterable<PsiProvidesStatement> getProvides();
|
||||
}
|
||||
+9
-5
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -21,12 +21,16 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents an {@code exports} statement of a Java module declaration.
|
||||
* Represents a package access control statement ({@code exports} or {@code opens}) of a Java module declaration.
|
||||
*
|
||||
* @since 2016.3
|
||||
* @since 2017.1
|
||||
*/
|
||||
public interface PsiExportsStatement extends PsiElement {
|
||||
PsiExportsStatement[] EMPTY_ARRAY = new PsiExportsStatement[0];
|
||||
public interface PsiPackageAccessibilityStatement extends PsiElement {
|
||||
PsiPackageAccessibilityStatement[] EMPTY_ARRAY = new PsiPackageAccessibilityStatement[0];
|
||||
|
||||
enum Role {EXPORTS, OPENS}
|
||||
|
||||
@NotNull Role getRole();
|
||||
|
||||
@Nullable PsiJavaCodeReferenceElement getPackageReference();
|
||||
@Nullable String getPackageName();
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -24,13 +24,14 @@ import com.intellij.psi.impl.source.SourceTreeToPsiMap;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.psi.javadoc.PsiDocComment;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.JBIterable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import java.util.Collections;
|
||||
|
||||
import static com.intellij.util.containers.ContainerUtil.newArrayList;
|
||||
|
||||
public class ClsJavaModuleImpl extends ClsRepositoryPsiElement<PsiJavaModuleStub> implements PsiJavaModule {
|
||||
private PsiJavaModuleReferenceElement myReference;
|
||||
@@ -60,8 +61,26 @@ public class ClsJavaModuleImpl extends ClsRepositoryPsiElement<PsiJavaModuleStub
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiExportsStatement> getExports() {
|
||||
return JBIterable.of(getStub().getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiExportsStatement.EMPTY_ARRAY));
|
||||
public Iterable<PsiPackageAccessibilityStatement> getExports() {
|
||||
return JBIterable.of(getStub().getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiPackageAccessibilityStatement.EMPTY_ARRAY));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiPackageAccessibilityStatement> getOpens() {
|
||||
return JBIterable.of(getStub().getChildrenByType(JavaElementType.OPENS_STATEMENT, PsiPackageAccessibilityStatement.EMPTY_ARRAY));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiUsesStatement> getUses() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiProvidesStatement> getProvides() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -75,7 +94,7 @@ public class ClsJavaModuleImpl extends ClsRepositoryPsiElement<PsiJavaModuleStub
|
||||
|
||||
if (buffer.length() > position) buffer.append('\n');
|
||||
position = buffer.length();
|
||||
for (PsiExportsStatement statement : getExports()) appendText(statement, newIndentLevel, buffer);
|
||||
for (PsiPackageAccessibilityStatement statement : getExports()) appendText(statement, newIndentLevel, buffer);
|
||||
|
||||
if (buffer.length() > position) buffer.append('\n');
|
||||
StringUtil.repeatSymbol(buffer, ' ', newIndentLevel);
|
||||
@@ -89,11 +108,11 @@ public class ClsJavaModuleImpl extends ClsRepositoryPsiElement<PsiJavaModuleStub
|
||||
setMirrorCheckingType(element, JavaElementType.MODULE);
|
||||
setMirror(getNameElement(), mirror.getNameElement());
|
||||
|
||||
setMirrors(asList(getStub().getChildrenByType(JavaElementType.REQUIRES_STATEMENT, PsiRequiresStatement.EMPTY_ARRAY)),
|
||||
PsiTreeUtil.getChildrenOfTypeAsList(mirror, PsiRequiresStatement.class));
|
||||
setMirrors(newArrayList(getStub().getChildrenByType(JavaElementType.REQUIRES_STATEMENT, PsiRequiresStatement.EMPTY_ARRAY)),
|
||||
newArrayList(mirror.getRequires()));
|
||||
|
||||
setMirrors(asList(getStub().getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiExportsStatement.EMPTY_ARRAY)),
|
||||
PsiTreeUtil.getChildrenOfTypeAsList(mirror, PsiExportsStatement.class));
|
||||
setMirrors(newArrayList(getStub().getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiPackageAccessibilityStatement.EMPTY_ARRAY)),
|
||||
newArrayList(mirror.getExports()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+19
-12
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,11 +18,11 @@ package com.intellij.psi.impl.compiled;
|
||||
import com.intellij.openapi.util.AtomicNotNullLazyValue;
|
||||
import com.intellij.openapi.util.NotNullLazyValue;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiExportsStatement;
|
||||
import com.intellij.psi.PsiJavaCodeReferenceElement;
|
||||
import com.intellij.psi.PsiJavaModuleReferenceElement;
|
||||
import com.intellij.psi.impl.java.stubs.PsiExportsStatementStub;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.PsiPackageAccessibilityStatement;
|
||||
import com.intellij.psi.impl.java.stubs.JavaPackageAccessibilityStatementElementType;
|
||||
import com.intellij.psi.impl.java.stubs.PsiPackageAccessibilityStatementStub;
|
||||
import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
@@ -30,18 +30,19 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class ClsExportsStatementImpl extends ClsRepositoryPsiElement<PsiExportsStatementStub> implements PsiExportsStatement {
|
||||
public class ClsPackageAccessibilityStatementImpl extends ClsRepositoryPsiElement<PsiPackageAccessibilityStatementStub> implements PsiPackageAccessibilityStatement {
|
||||
private final NotNullLazyValue<PsiJavaCodeReferenceElement> myPackageReference;
|
||||
private final NotNullLazyValue<Iterable<PsiJavaModuleReferenceElement>> myModuleReferences;
|
||||
|
||||
public ClsExportsStatementImpl(PsiExportsStatementStub stub) {
|
||||
public ClsPackageAccessibilityStatementImpl(PsiPackageAccessibilityStatementStub stub) {
|
||||
super(stub);
|
||||
myPackageReference = new AtomicNotNullLazyValue<PsiJavaCodeReferenceElement>() {
|
||||
@NotNull
|
||||
@Override
|
||||
protected PsiJavaCodeReferenceElement compute() {
|
||||
return new ClsJavaCodeReferenceElementImpl(ClsExportsStatementImpl.this, getStub().getPackageName());
|
||||
return new ClsJavaCodeReferenceElementImpl(ClsPackageAccessibilityStatementImpl.this, getStub().getPackageName());
|
||||
}
|
||||
};
|
||||
myModuleReferences = new AtomicNotNullLazyValue<Iterable<PsiJavaModuleReferenceElement>>() {
|
||||
@@ -51,13 +52,19 @@ public class ClsExportsStatementImpl extends ClsRepositoryPsiElement<PsiExportsS
|
||||
return ContainerUtil.map(getStub().getTargets(), new Function<String, PsiJavaModuleReferenceElement>() {
|
||||
@Override
|
||||
public PsiJavaModuleReferenceElement fun(String target) {
|
||||
return new ClsJavaModuleReferenceElementImpl(ClsExportsStatementImpl.this, target);
|
||||
return new ClsJavaModuleReferenceElementImpl(ClsPackageAccessibilityStatementImpl.this, target);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Role getRole() {
|
||||
return JavaPackageAccessibilityStatementElementType.typeToRole(getStub().getStubType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiJavaCodeReferenceElement getPackageReference() {
|
||||
return myPackageReference.getValue();
|
||||
@@ -84,8 +91,8 @@ public class ClsExportsStatementImpl extends ClsRepositoryPsiElement<PsiExportsS
|
||||
@Override
|
||||
public void appendMirrorText(int indentLevel, @NotNull StringBuilder buffer) {
|
||||
StringUtil.repeatSymbol(buffer, ' ', indentLevel);
|
||||
PsiExportsStatementStub stub = getStub();
|
||||
buffer.append("exports ").append(stub.getPackageName());
|
||||
PsiPackageAccessibilityStatementStub stub = getStub();
|
||||
buffer.append(getRole().toString().toLowerCase(Locale.US)).append(' ').append(stub.getPackageName());
|
||||
List<String> targets = stub.getTargets();
|
||||
if (!targets.isEmpty()) {
|
||||
buffer.append(" to ");
|
||||
@@ -99,11 +106,11 @@ public class ClsExportsStatementImpl extends ClsRepositoryPsiElement<PsiExportsS
|
||||
|
||||
@Override
|
||||
public void setMirror(@NotNull TreeElement element) throws InvalidMirrorException {
|
||||
setMirrorCheckingType(element, JavaElementType.EXPORTS_STATEMENT);
|
||||
setMirrorCheckingType(element, getStub().getStubType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PsiExportsStatement";
|
||||
return "PsiPackageAccessibilityStatement[" + getRole() + "]";
|
||||
}
|
||||
}
|
||||
+5
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,8 +17,8 @@ package com.intellij.psi.impl.compiled;
|
||||
|
||||
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub;
|
||||
import com.intellij.psi.impl.java.stubs.PsiJavaModuleStub;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiExportsStatementStubImpl;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiJavaModuleStubImpl;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiPackageAccessibilityStatementStubImpl;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiRequiresStatementStubImpl;
|
||||
import org.jetbrains.org.objectweb.asm.ClassVisitor;
|
||||
import org.jetbrains.org.objectweb.asm.ModuleVisitor;
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static com.intellij.psi.impl.java.stubs.JavaStubElementTypes.EXPORTS_STATEMENT;
|
||||
import static com.intellij.util.BitUtil.isSet;
|
||||
|
||||
public class ModuleStubBuildingVisitor extends ClassVisitor {
|
||||
@@ -60,7 +61,8 @@ public class ModuleStubBuildingVisitor extends ClassVisitor {
|
||||
|
||||
@Override
|
||||
public void visitExport(String packageName, String... modules) {
|
||||
new PsiExportsStatementStubImpl(myResult, packageName.replace('/', '.'), modules == null ? null : Arrays.asList(modules));
|
||||
new PsiPackageAccessibilityStatementStubImpl(
|
||||
myResult, EXPORTS_STATEMENT, packageName.replace('/', '.'), modules == null ? null : Arrays.asList(modules));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -13,16 +13,14 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
package com.intellij.psi.impl.java.stubs;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.compiled.*;
|
||||
import com.intellij.psi.impl.compiled.ClsJavaModuleImpl;
|
||||
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
public class ClsStubPsiFactory extends StubPsiFactory {
|
||||
public static final ClsStubPsiFactory INSTANCE = new ClsStubPsiFactory();
|
||||
|
||||
@@ -112,7 +110,7 @@ public class ClsStubPsiFactory extends StubPsiFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiExportsStatement createExportsStatement(PsiExportsStatementStub stub) {
|
||||
return new ClsExportsStatementImpl(stub);
|
||||
public PsiPackageAccessibilityStatement createPackageAccessibilityStatement(PsiPackageAccessibilityStatementStub stub) {
|
||||
return new ClsPackageAccessibilityStatementImpl(stub);
|
||||
}
|
||||
}
|
||||
+31
-26
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -19,10 +19,10 @@ import com.intellij.lang.ASTNode;
|
||||
import com.intellij.lang.LighterAST;
|
||||
import com.intellij.lang.LighterASTNode;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiExportsStatement;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiExportsStatementStubImpl;
|
||||
import com.intellij.psi.impl.source.ExportsElement;
|
||||
import com.intellij.psi.impl.source.PsiExportsStatementImpl;
|
||||
import com.intellij.psi.PsiPackageAccessibilityStatement;
|
||||
import com.intellij.psi.impl.java.stubs.impl.PsiPackageAccessibilityStatementStubImpl;
|
||||
import com.intellij.psi.impl.source.PackageAccessibilityStatementElement;
|
||||
import com.intellij.psi.impl.source.PsiPackageAccessibilityStatementImpl;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.impl.source.tree.JavaSourceUtil;
|
||||
import com.intellij.psi.stubs.IndexSink;
|
||||
@@ -36,31 +36,29 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import static com.intellij.util.ObjectUtils.notNull;
|
||||
public class JavaPackageAccessibilityStatementElementType extends JavaStubElementType<PsiPackageAccessibilityStatementStub, PsiPackageAccessibilityStatement> {
|
||||
public JavaPackageAccessibilityStatementElementType(@NotNull String debugName) {
|
||||
super(debugName);
|
||||
}
|
||||
|
||||
public class JavaExportsStatementElementType extends JavaStubElementType<PsiExportsStatementStub, PsiExportsStatement> {
|
||||
public JavaExportsStatementElementType() {
|
||||
super("EXPORTS_STATEMENT");
|
||||
@Override
|
||||
public PsiPackageAccessibilityStatement createPsi(@NotNull PsiPackageAccessibilityStatementStub stub) {
|
||||
return getPsiFactory(stub).createPackageAccessibilityStatement(stub);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiPackageAccessibilityStatement createPsi(@NotNull ASTNode node) {
|
||||
return new PsiPackageAccessibilityStatementImpl(node);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ASTNode createCompositeNode() {
|
||||
return new ExportsElement(this);
|
||||
return new PackageAccessibilityStatementElement(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiExportsStatement createPsi(@NotNull PsiExportsStatementStub stub) {
|
||||
return getPsiFactory(stub).createExportsStatement(stub);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiExportsStatement createPsi(@NotNull ASTNode node) {
|
||||
return new PsiExportsStatementImpl(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiExportsStatementStub createStub(LighterAST tree, LighterASTNode node, StubElement parentStub) {
|
||||
public PsiPackageAccessibilityStatementStub createStub(LighterAST tree, LighterASTNode node, StubElement parentStub) {
|
||||
String refText = null;
|
||||
List<String> to = ContainerUtil.newSmartList();
|
||||
|
||||
@@ -70,23 +68,30 @@ public class JavaExportsStatementElementType extends JavaStubElementType<PsiExpo
|
||||
else if (type == JavaElementType.MODULE_REFERENCE) to.add(JavaSourceUtil.getReferenceText(tree, child));
|
||||
}
|
||||
|
||||
return new PsiExportsStatementStubImpl(parentStub, notNull(refText, ""), to);
|
||||
return new PsiPackageAccessibilityStatementStubImpl(parentStub, this, refText, to);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(@NotNull PsiExportsStatementStub stub, @NotNull StubOutputStream dataStream) throws IOException {
|
||||
public void serialize(@NotNull PsiPackageAccessibilityStatementStub stub, @NotNull StubOutputStream dataStream) throws IOException {
|
||||
dataStream.writeUTFFast(stub.getPackageName());
|
||||
dataStream.writeUTFFast(StringUtil.join(stub.getTargets(), "/"));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public PsiExportsStatementStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
|
||||
public PsiPackageAccessibilityStatementStub deserialize(@NotNull StubInputStream dataStream, StubElement parentStub) throws IOException {
|
||||
String packageName = dataStream.readUTFFast();
|
||||
List<String> targets = StringUtil.split(dataStream.readUTFFast(), "/");
|
||||
return new PsiExportsStatementStubImpl(parentStub, packageName, targets);
|
||||
return new PsiPackageAccessibilityStatementStubImpl(parentStub, this, packageName, targets);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void indexStub(@NotNull PsiExportsStatementStub stub, @NotNull IndexSink sink) { }
|
||||
public void indexStub(@NotNull PsiPackageAccessibilityStatementStub stub, @NotNull IndexSink sink) { }
|
||||
|
||||
@NotNull
|
||||
public static PsiPackageAccessibilityStatement.Role typeToRole(@NotNull IElementType type) {
|
||||
if (type == JavaElementType.EXPORTS_STATEMENT) return PsiPackageAccessibilityStatement.Role.EXPORTS;
|
||||
if (type == JavaElementType.OPENS_STATEMENT) return PsiPackageAccessibilityStatement.Role.OPENS;
|
||||
throw new IllegalArgumentException("Unknown type: " + type);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -40,7 +40,9 @@ public interface JavaStubElementTypes {
|
||||
JavaImportListElementType IMPORT_LIST = new JavaImportListElementType();
|
||||
JavaModuleElementType MODULE = new JavaModuleElementType();
|
||||
JavaRequiresStatementElementType REQUIRES_STATEMENT = new JavaRequiresStatementElementType();
|
||||
JavaExportsStatementElementType EXPORTS_STATEMENT = new JavaExportsStatementElementType();
|
||||
|
||||
JavaPackageAccessibilityStatementElementType EXPORTS_STATEMENT = new JavaPackageAccessibilityStatementElementType("EXPORTS_STATEMENT");
|
||||
JavaPackageAccessibilityStatementElementType OPENS_STATEMENT = new JavaPackageAccessibilityStatementElementType("OPENS_STATEMENT");
|
||||
|
||||
JavaClassElementType CLASS = new JavaClassElementType("CLASS") {
|
||||
@NotNull
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -15,12 +15,12 @@
|
||||
*/
|
||||
package com.intellij.psi.impl.java.stubs;
|
||||
|
||||
import com.intellij.psi.PsiExportsStatement;
|
||||
import com.intellij.psi.PsiPackageAccessibilityStatement;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface PsiExportsStatementStub extends StubElement<PsiExportsStatement> {
|
||||
public interface PsiPackageAccessibilityStatementStub extends StubElement<PsiPackageAccessibilityStatement> {
|
||||
String getPackageName();
|
||||
List<String> getTargets();
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -123,7 +123,7 @@ public class SourceStubPsiFactory extends StubPsiFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiExportsStatement createExportsStatement(PsiExportsStatementStub stub) {
|
||||
return new PsiExportsStatementImpl(stub);
|
||||
public PsiPackageAccessibilityStatement createPackageAccessibilityStatement(PsiPackageAccessibilityStatementStub stub) {
|
||||
return new PsiPackageAccessibilityStatementImpl(stub);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -13,14 +13,13 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
package com.intellij.psi.impl.java.stubs;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
public abstract class StubPsiFactory {
|
||||
public abstract PsiClass createClass(PsiClassStub stub);
|
||||
|
||||
@@ -60,7 +59,7 @@ public abstract class StubPsiFactory {
|
||||
return null;
|
||||
}
|
||||
|
||||
public PsiExportsStatement createExportsStatement(PsiExportsStatementStub stub) {
|
||||
public PsiPackageAccessibilityStatement createPackageAccessibilityStatement(PsiPackageAccessibilityStatementStub stub) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+12
-9
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -15,22 +15,25 @@
|
||||
*/
|
||||
package com.intellij.psi.impl.java.stubs.impl;
|
||||
|
||||
import com.intellij.psi.PsiExportsStatement;
|
||||
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
|
||||
import com.intellij.psi.impl.java.stubs.PsiExportsStatementStub;
|
||||
import com.intellij.psi.PsiPackageAccessibilityStatement;
|
||||
import com.intellij.psi.impl.java.stubs.PsiPackageAccessibilityStatementStub;
|
||||
import com.intellij.psi.stubs.IStubElementType;
|
||||
import com.intellij.psi.stubs.StubBase;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class PsiExportsStatementStubImpl extends StubBase<PsiExportsStatement> implements PsiExportsStatementStub {
|
||||
import static com.intellij.psi.impl.java.stubs.JavaPackageAccessibilityStatementElementType.typeToRole;
|
||||
import static com.intellij.util.ObjectUtils.notNull;
|
||||
|
||||
public class PsiPackageAccessibilityStatementStubImpl extends StubBase<PsiPackageAccessibilityStatement> implements PsiPackageAccessibilityStatementStub {
|
||||
private final String myPackageName;
|
||||
private final List<String> myTargets;
|
||||
|
||||
public PsiExportsStatementStubImpl(StubElement parent, String packageName, List<String> targets) {
|
||||
super(parent, JavaStubElementTypes.EXPORTS_STATEMENT);
|
||||
myPackageName = packageName;
|
||||
public PsiPackageAccessibilityStatementStubImpl(StubElement parent, IStubElementType type, String packageName, List<String> targets) {
|
||||
super(parent, type);
|
||||
myPackageName = notNull(packageName, "");
|
||||
myTargets = targets == null || targets.isEmpty() ? Collections.<String>emptyList() : Collections.unmodifiableList(targets);
|
||||
}
|
||||
|
||||
@@ -47,7 +50,7 @@ public class PsiExportsStatementStubImpl extends StubBase<PsiExportsStatement> i
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("PsiExportsStatementStub:").append(myPackageName);
|
||||
sb.append("PsiPackageAccessibilityStatementStub[").append(typeToRole(getStubType())).append("]:").append(myPackageName);
|
||||
for (String target : myTargets) sb.append(':').append(target);
|
||||
return sb.toString();
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -75,7 +75,25 @@ public class LightJavaModule extends LightElement implements PsiJavaModule {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiExportsStatement> getExports() {
|
||||
public Iterable<PsiPackageAccessibilityStatement> getExports() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiPackageAccessibilityStatement> getOpens() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiUsesStatement> getUses() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiProvidesStatement> getProvides() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@@ -146,7 +164,6 @@ public class LightJavaModule extends LightElement implements PsiJavaModule {
|
||||
final PsiDirectory directory = manager.findDirectory(jarRoot);
|
||||
assert directory != null : jarRoot;
|
||||
return CachedValuesManager.getCachedValue(directory, new CachedValueProvider<LightJavaModule>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<LightJavaModule> compute() {
|
||||
LightJavaModule module = new LightJavaModule(manager, jarRoot);
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -27,8 +27,8 @@ import org.jetbrains.annotations.Nullable;
|
||||
/**
|
||||
* @author Pavel.Dolgov
|
||||
*/
|
||||
public class ExportsElement extends CompositeElement {
|
||||
public ExportsElement(@NotNull IElementType type) {
|
||||
public class PackageAccessibilityStatementElement extends CompositeElement {
|
||||
public PackageAccessibilityStatementElement(@NotNull IElementType type) {
|
||||
super(type);
|
||||
}
|
||||
|
||||
@@ -63,4 +63,4 @@ public class ExportsElement extends CompositeElement {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -134,7 +134,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme
|
||||
return CLASS_OR_PACKAGE_NAME_KIND; // incomplete code
|
||||
}
|
||||
}
|
||||
if (i == JavaElementType.PACKAGE_STATEMENT || i == JavaElementType.EXPORTS_STATEMENT) {
|
||||
if (i == JavaElementType.PACKAGE_STATEMENT || i == JavaElementType.EXPORTS_STATEMENT || i == JavaElementType.OPENS_STATEMENT) {
|
||||
return PACKAGE_NAME_KIND;
|
||||
}
|
||||
if (i == JavaElementType.IMPORT_STATEMENT) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,6 +18,7 @@ package com.intellij.psi.impl.source;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.navigation.ItemPresentation;
|
||||
import com.intellij.navigation.ItemPresentationProviders;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
|
||||
import com.intellij.psi.impl.java.stubs.PsiJavaModuleStub;
|
||||
@@ -32,6 +33,19 @@ import org.jetbrains.annotations.Nullable;
|
||||
import static com.intellij.psi.SyntaxTraverser.psiTraverser;
|
||||
|
||||
public class PsiJavaModuleImpl extends JavaStubPsiElement<PsiJavaModuleStub> implements PsiJavaModule {
|
||||
private static final Condition<PsiPackageAccessibilityStatement> EXPORTS_FILTER = new Condition<PsiPackageAccessibilityStatement>() {
|
||||
@Override
|
||||
public boolean value(PsiPackageAccessibilityStatement statement) {
|
||||
return statement.getRole() == PsiPackageAccessibilityStatement.Role.EXPORTS;
|
||||
}
|
||||
};
|
||||
private static final Condition<PsiPackageAccessibilityStatement> OPENS_FILTER = new Condition<PsiPackageAccessibilityStatement>() {
|
||||
@Override
|
||||
public boolean value(PsiPackageAccessibilityStatement statement) {
|
||||
return statement.getRole() == PsiPackageAccessibilityStatement.Role.OPENS;
|
||||
}
|
||||
};
|
||||
|
||||
public PsiJavaModuleImpl(@NotNull PsiJavaModuleStub stub) {
|
||||
super(stub, JavaStubElementTypes.MODULE);
|
||||
}
|
||||
@@ -72,16 +86,40 @@ public class PsiJavaModuleImpl extends JavaStubPsiElement<PsiJavaModuleStub> imp
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiExportsStatement> getExports() {
|
||||
public Iterable<PsiPackageAccessibilityStatement> getExports() {
|
||||
PsiJavaModuleStub stub = getGreenStub();
|
||||
if (stub != null) {
|
||||
return JBIterable.of(stub.getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiExportsStatement.EMPTY_ARRAY));
|
||||
return JBIterable.of(stub.getChildrenByType(JavaElementType.EXPORTS_STATEMENT, PsiPackageAccessibilityStatement.EMPTY_ARRAY));
|
||||
}
|
||||
else {
|
||||
return psiTraverser().children(this).filter(PsiExportsStatement.class);
|
||||
return psiTraverser().children(this).filter(PsiPackageAccessibilityStatement.class).filter(EXPORTS_FILTER);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiPackageAccessibilityStatement> getOpens() {
|
||||
PsiJavaModuleStub stub = getGreenStub();
|
||||
if (stub != null) {
|
||||
return JBIterable.of(stub.getChildrenByType(JavaElementType.OPENS_STATEMENT, PsiPackageAccessibilityStatement.EMPTY_ARRAY));
|
||||
}
|
||||
else {
|
||||
return psiTraverser().children(this).filter(PsiPackageAccessibilityStatement.class).filter(OPENS_FILTER);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiUsesStatement> getUses() {
|
||||
return psiTraverser().children(this).filter(PsiUsesStatement.class);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Iterable<PsiProvidesStatement> getProvides() {
|
||||
return psiTraverser().children(this).filter(PsiProvidesStatement.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return getModuleName();
|
||||
|
||||
+22
-11
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,8 +18,9 @@ package com.intellij.psi.impl.source;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
|
||||
import com.intellij.psi.impl.java.stubs.PsiExportsStatementStub;
|
||||
import com.intellij.psi.impl.java.stubs.JavaPackageAccessibilityStatementElementType;
|
||||
import com.intellij.psi.impl.java.stubs.PsiPackageAccessibilityStatementStub;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -29,15 +30,23 @@ import java.util.List;
|
||||
|
||||
import static com.intellij.psi.SyntaxTraverser.psiTraverser;
|
||||
|
||||
public class PsiExportsStatementImpl extends JavaStubPsiElement<PsiExportsStatementStub> implements PsiExportsStatement {
|
||||
public PsiExportsStatementImpl(@NotNull PsiExportsStatementStub stub) {
|
||||
super(stub, JavaStubElementTypes.EXPORTS_STATEMENT);
|
||||
public class PsiPackageAccessibilityStatementImpl extends JavaStubPsiElement<PsiPackageAccessibilityStatementStub> implements PsiPackageAccessibilityStatement {
|
||||
public PsiPackageAccessibilityStatementImpl(@NotNull PsiPackageAccessibilityStatementStub stub) {
|
||||
super(stub, stub.getStubType());
|
||||
}
|
||||
|
||||
public PsiExportsStatementImpl(@NotNull ASTNode node) {
|
||||
public PsiPackageAccessibilityStatementImpl(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Role getRole() {
|
||||
PsiPackageAccessibilityStatementStub stub = getGreenStub();
|
||||
IElementType type = stub != null ? stub.getStubType() : getNode().getElementType();
|
||||
return JavaPackageAccessibilityStatementElementType.typeToRole(type);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public PsiJavaCodeReferenceElement getPackageReference() {
|
||||
@@ -47,7 +56,7 @@ public class PsiExportsStatementImpl extends JavaStubPsiElement<PsiExportsStatem
|
||||
@Nullable
|
||||
@Override
|
||||
public String getPackageName() {
|
||||
PsiExportsStatementStub stub = getGreenStub();
|
||||
PsiPackageAccessibilityStatementStub stub = getGreenStub();
|
||||
if (stub != null) {
|
||||
return StringUtil.nullize(stub.getPackageName());
|
||||
}
|
||||
@@ -66,7 +75,7 @@ public class PsiExportsStatementImpl extends JavaStubPsiElement<PsiExportsStatem
|
||||
@NotNull
|
||||
@Override
|
||||
public List<String> getModuleNames() {
|
||||
PsiExportsStatementStub stub = getGreenStub();
|
||||
PsiPackageAccessibilityStatementStub stub = getGreenStub();
|
||||
if (stub != null) {
|
||||
return stub.getTargets();
|
||||
}
|
||||
@@ -80,7 +89,9 @@ public class PsiExportsStatementImpl extends JavaStubPsiElement<PsiExportsStatem
|
||||
@Override
|
||||
public void accept(@NotNull PsiElementVisitor visitor) {
|
||||
if (visitor instanceof JavaElementVisitor) {
|
||||
((JavaElementVisitor)visitor).visitExportsStatement(this);
|
||||
Role role = getRole();
|
||||
if (role == Role.EXPORTS) ((JavaElementVisitor)visitor).visitExportsStatement(this);
|
||||
else if (role == Role.OPENS) ((JavaElementVisitor)visitor).visitOpensStatement(this);
|
||||
}
|
||||
else {
|
||||
visitor.visitElement(this);
|
||||
@@ -89,6 +100,6 @@ public class PsiExportsStatementImpl extends JavaStubPsiElement<PsiExportsStatem
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PsiExportsStatement";
|
||||
return "PsiPackageAccessibilityStatement";
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -70,7 +70,7 @@ public interface ElementType extends JavaTokenType, JavaDocTokenType, JavaElemen
|
||||
WHILE_STATEMENT, FOR_STATEMENT, FOREACH_STATEMENT, DO_WHILE_STATEMENT, SWITCH_STATEMENT, SWITCH_LABEL_STATEMENT, BREAK_STATEMENT,
|
||||
CONTINUE_STATEMENT, RETURN_STATEMENT, THROW_STATEMENT, SYNCHRONIZED_STATEMENT, TRY_STATEMENT, LABELED_STATEMENT, ASSERT_STATEMENT);
|
||||
|
||||
TokenSet JAVA_MODULE_STATEMENT_BIT_SET = TokenSet.create(REQUIRES_STATEMENT, EXPORTS_STATEMENT, USES_STATEMENT, PROVIDES_STATEMENT);
|
||||
TokenSet JAVA_MODULE_STATEMENT_BIT_SET = TokenSet.create(REQUIRES_STATEMENT, EXPORTS_STATEMENT, OPENS_STATEMENT, USES_STATEMENT, PROVIDES_STATEMENT);
|
||||
|
||||
TokenSet IMPORT_STATEMENT_BASE_BIT_SET = TokenSet.create(IMPORT_STATEMENT, IMPORT_STATIC_STATEMENT);
|
||||
TokenSet CLASS_KEYWORD_BIT_SET = TokenSet.create(CLASS_KEYWORD, INTERFACE_KEYWORD, ENUM_KEYWORD);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -88,6 +88,7 @@ public interface JavaElementType {
|
||||
IElementType MODULE = JavaStubElementTypes.MODULE;
|
||||
IElementType REQUIRES_STATEMENT = JavaStubElementTypes.REQUIRES_STATEMENT;
|
||||
IElementType EXPORTS_STATEMENT = JavaStubElementTypes.EXPORTS_STATEMENT;
|
||||
IElementType OPENS_STATEMENT = JavaStubElementTypes.OPENS_STATEMENT;
|
||||
|
||||
IElementType IMPORT_STATIC_REFERENCE = new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", PsiImportStaticReferenceElementImpl.class);
|
||||
IElementType TYPE = new JavaCompositeElementType("TYPE", PsiTypeElementImpl.class);
|
||||
|
||||
@@ -2,5 +2,5 @@ PsiJavaFileStub []
|
||||
PsiJavaModuleStub:M.N
|
||||
PsiRequiresStatementStub:0:java.desktop
|
||||
PsiRequiresStatementStub:1:java.logging
|
||||
PsiExportsStatementStub:pkg.d1
|
||||
PsiExportsStatementStub:pkg.d2:java.desktop
|
||||
PsiPackageAccessibilityStatementStub[EXPORTS]:pkg.d1
|
||||
PsiPackageAccessibilityStatementStub[EXPORTS]:pkg.d2:java.desktop
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports0.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiErrorElement:Package reference expected
|
||||
<empty list>
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports1.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports2.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports3.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports4.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports5.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports6.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports7.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -7,7 +7,7 @@ PsiJavaFile:Exports8.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LBRACE('{')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiExportsStatement
|
||||
PsiPackageAccessibilityStatement
|
||||
PsiKeyword:exports('exports')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaCodeReferenceElement:pkg
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
* Copyright 2000-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -503,7 +503,7 @@ public class JavaStubBuilderTest extends LightIdeaTestCase {
|
||||
"PsiJavaFileStub []\n" +
|
||||
" MODULE:PsiJavaModuleStub:M.N\n" +
|
||||
" REQUIRES_STATEMENT:PsiRequiresStatementStub:0:A.B\n" +
|
||||
" EXPORTS_STATEMENT:PsiExportsStatementStub:m.n\n");
|
||||
" EXPORTS_STATEMENT:PsiPackageAccessibilityStatementStub[EXPORTS]:m.n\n");
|
||||
}
|
||||
|
||||
public void testSOEProof() {
|
||||
|
||||
+1
-1
@@ -85,7 +85,7 @@ public class ClassEscapesItsScopeInspection extends BaseJavaBatchLocalInspection
|
||||
Module module = ProjectFileIndex.SERVICE.getInstance(holder.getProject()).getModuleForFile(vFile);
|
||||
if (module != null) {
|
||||
Set<String> exportedPackageNames =
|
||||
new THashSet<>(ContainerUtil.mapNotNull(psiModule.getExports(), PsiExportsStatement::getPackageName));
|
||||
new THashSet<>(ContainerUtil.mapNotNull(psiModule.getExports(), PsiPackageAccessibilityStatement::getPackageName));
|
||||
if (exportedPackageNames.contains(javaFile.getPackageName())) {
|
||||
checkers.add(new Java9NonAccessibleTypeExposedVisitor(holder, module, psiModule.getModuleName(), exportedPackageNames));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user