Merge branch 'master' of git.labs.intellij.net:idea/community

This commit is contained in:
Dmitry Trofimov
2010-08-02 15:58:00 +04:00
366 changed files with 13215 additions and 1824 deletions
@@ -950,6 +950,7 @@ public class CompileDriver {
}
}));
final DumbService dumbService = DumbService.getInstance(myProject);
try {
VirtualFile[] snapshot = null;
final Map<Chunk<Module>, Collection<VirtualFile>> chunkMap = new HashMap<Chunk<Module>, Collection<VirtualFile>>();
@@ -963,6 +964,7 @@ public class CompileDriver {
final Set<VirtualFile> allDependent = new HashSet<VirtualFile>();
try {
int round = 0;
boolean compiledSomethingForThisChunk = false;
Collection<VirtualFile> dependentFiles = Collections.emptyList();
final Function<Pair<int[], Set<VirtualFile>>, Pair<int[], Set<VirtualFile>>> dependencyFilter = new DependentClassesCumulativeFilter();
@@ -973,8 +975,8 @@ public class CompileDriver {
if (context.getProgressIndicator().isCanceled()) {
throw new ExitException(ExitStatus.CANCELLED);
}
context.getProgressIndicator().setText("Preparing sources for " + compiler.getDescription());
DumbService.getInstance(myProject).waitForSmartMode();
dumbService.waitForSmartMode();
if (round == 0) {
if (snapshot == null || ContainerUtil.intersects(generatedTypes, compilerManager.getRegisteredInputTypes(compiler))) {
@@ -1022,10 +1024,11 @@ public class CompileDriver {
}
didSomething |= compiledSomething;
compiledSomethingForThisChunk |= didSomething;
}
final boolean hasUnprocessedTraverseRoots = context.getDependencyCache().hasUnprocessedTraverseRoots();
if (!isRebuild && (didSomething || hasUnprocessedTraverseRoots)) {
if (!isRebuild && (compiledSomethingForThisChunk || hasUnprocessedTraverseRoots)) {
final Set<VirtualFile> compiledWithSuccess;
final Set<VirtualFile> compiledWithErrors = CacheUtils.getFilesCompiledWithErrors(context);
if (compiledWithErrors.isEmpty()) {
@@ -1516,7 +1519,7 @@ public class CompileDriver {
});
if (ex[0] != null) {
throw ex[0];
}
}
if (onlyCheckStatus) {
if (toGenerate.isEmpty() && pathsToRemove.isEmpty()) {
@@ -93,15 +93,13 @@ public class NotNullVerifyingInstrumenter extends ClassAdapter implements Opcode
av = mv.visitParameterAnnotation(parameter,
anno,
visible);
if (isReferenceType(args[parameter])) {
if (anno.equals(NOT_NULL_ANNO)) {
myNotNullParams.add(new Integer(parameter));
}
else if (anno.equals("Ljava/lang/Synthetic;")) {
// See asm r1278 for what we do this,
// http://forge.objectweb.org/tracker/index.php?func=detail&aid=307392&group_id=23&atid=100023
mySyntheticCount++;
}
if (isReferenceType(args[parameter]) && anno.equals(NOT_NULL_ANNO)) {
myNotNullParams.add(new Integer(parameter));
}
else if (anno.equals("Ljava/lang/Synthetic;")) {
// See asm r1278 for what we do this,
// http://forge.objectweb.org/tracker/index.php?func=detail&aid=307392&group_id=23&atid=100023
mySyntheticCount++;
}
return av;
}
@@ -197,9 +195,6 @@ public class NotNullVerifyingInstrumenter extends ClassAdapter implements Opcode
private int getStartParameterIndex(final String name) {
int result = 0;
if (CONSTRUCTOR_NAME.equals(name)) {
if (mySuperName.equals(ENUM_CLASS_NAME)) {
result += 2;
}
if (myIsNotStaticInner) {
result += 1;
}
@@ -38,6 +38,7 @@ public interface DebuggerActions extends XDebuggerActions {
@NonNls String NEW_WATCH = "Debugger.NewWatch";
@NonNls String EDIT_WATCH = "Debugger.EditWatch";
@NonNls String MARK_OBJECT = "Debugger.MarkObject";
@NonNls String COPY_VALUE = "Debugger.CopyValue";
@NonNls String SET_VALUE = "Debugger.SetValue";
@NonNls String EDIT_FRAME_SOURCE = "Debugger.EditFrameSource";
@NonNls String EDIT_NODE_SOURCE = "Debugger.EditNodeSource";
@@ -27,6 +27,7 @@ import com.intellij.debugger.ui.impl.watch.DebuggerTree;
import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionPopupMenu;
import com.intellij.openapi.actionSystem.CommonShortcuts;
import com.intellij.openapi.project.Project;
import com.intellij.ui.ScrollPaneFactory;
import org.jetbrains.annotations.NotNull;
@@ -40,8 +41,9 @@ public class InspectPanel extends DebuggerTreePanel {
getInspectTree().setInspectDescriptor(inspectDescriptor);
add(ScrollPaneFactory.createScrollPane(getInspectTree()), BorderLayout.CENTER);
final Disposable disposable = DebuggerAction.installEditAction(getInspectTree(), DebuggerActions.EDIT_NODE_SOURCE);
registerDisposable(disposable);
registerDisposable(DebuggerAction.installEditAction(getInspectTree(), DebuggerActions.EDIT_NODE_SOURCE));
overrideShortcut(getInspectTree(), DebuggerActions.COPY_VALUE, CommonShortcuts.getCopy());
setUpdateEnabled(true);
}
@@ -24,6 +24,7 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
import com.intellij.openapi.actionSystem.ShortcutSet;
import com.intellij.openapi.project.Project;
import com.intellij.util.Alarm;
import com.sun.jdi.VMDisconnectedException;
@@ -124,7 +125,7 @@ public abstract class UpdatableDebuggerView extends JPanel implements DebuggerVi
myDisposables.clear();
}
protected void overrideShortcut(final JComponent forComponent, final String actionId, final CustomShortcutSet shortcutSet) {
protected void overrideShortcut(final JComponent forComponent, final String actionId, final ShortcutSet shortcutSet) {
final AnAction action = ActionManager.getInstance().getAction(actionId);
action.registerCustomShortcutSet(shortcutSet, forComponent);
registerDisposable(new Disposable() {
@@ -43,6 +43,7 @@ public class VariablesPanel extends DebuggerTreePanel implements DataProvider{
add(ScrollPaneFactory.createScrollPane(frameTree), BorderLayout.CENTER);
registerDisposable(DebuggerAction.installEditAction(frameTree, DebuggerActions.EDIT_NODE_SOURCE));
overrideShortcut(frameTree, DebuggerActions.COPY_VALUE, CommonShortcuts.getCopy());
overrideShortcut(frameTree, DebuggerActions.SET_VALUE, new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0)));
new ValueNodeDnD(myTree, parent);
@@ -30,6 +30,7 @@ import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
import com.intellij.debugger.ui.impl.watch.WatchItemDescriptor;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionPopupMenu;
import com.intellij.openapi.actionSystem.CommonShortcuts;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.ui.ScrollPaneFactory;
@@ -44,8 +45,8 @@ public abstract class WatchPanel extends DebuggerTreePanel {
public WatchPanel(Project project, DebuggerStateManager stateManager) {
super(project, stateManager);
add(ScrollPaneFactory.createScrollPane(getWatchTree()), BorderLayout.CENTER);
final Disposable disposable = DebuggerAction.installEditAction(getWatchTree(), DebuggerActions.EDIT_NODE_SOURCE);
registerDisposable(disposable);
registerDisposable(DebuggerAction.installEditAction(getWatchTree(), DebuggerActions.EDIT_NODE_SOURCE));
overrideShortcut(getWatchTree(), DebuggerActions.COPY_VALUE, CommonShortcuts.getCopy());
}
protected DebuggerTree createTreeView() {
@@ -39,6 +39,7 @@ import com.intellij.util.StringBuilderSpinAllocator;
import com.sun.jdi.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
@@ -147,7 +148,7 @@ public class ClassRenderer extends NodeRendererImpl{
final List<Field> fields = refType.allFields();
if (fields.size() > 0) {
for (final Field field : fields) {
if (!shouldDisplay(field)) {
if (!shouldDisplay(evaluationContext, objRef, field)) {
continue;
}
children.add(nodeManager.createNode(nodeDescriptorFactory.getFieldDescriptor(parentDescriptor, objRef, field), evaluationContext));
@@ -164,13 +165,15 @@ public class ClassRenderer extends NodeRendererImpl{
builder.setChildren(children);
}
private boolean shouldDisplay(Field field) {
private boolean shouldDisplay(EvaluationContext context, @NotNull ObjectReference objInstance, @NotNull Field field) {
final boolean isSynthetic = DebuggerUtils.isSynthetic(field);
if (!SHOW_SYNTHETICS && isSynthetic) {
return false;
}
if (isSynthetic && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
return false;
if (isSynthetic) {
if (objInstance.equals(context.getThisObject()) && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
return false;
}
}
if(!SHOW_STATIC && field.isStatic()) {
return false;
@@ -32,4 +32,6 @@ public interface EvaluationContext extends StackFrameContext{
Project getProject();
ClassLoaderReference getClassLoader() throws EvaluateException;
Value getThisObject();
}
@@ -46,7 +46,8 @@ public class ProjectNameStep extends ModuleWizardStep {
myWizardContext = wizardContext;
myNamePathComponent = new NamePathComponent(IdeBundle.message("label.project.name"), IdeBundle.message("label.component.file.location",
StringUtil.capitalize(myWizardContext.getPresentationName())), 'a', 'l',
IdeBundle.message("title.select.project.file.directory"), IdeBundle.message("description.select.project.file.directory"));
IdeBundle.message("title.select.project.file.directory", myWizardContext.getPresentationName()),
IdeBundle.message("description.select.project.file.directory", myWizardContext.getPresentationName()));
myPanel = new JPanel(new GridBagLayout());
myPanel.setBorder(BorderFactory.createEtchedBorder());
@@ -134,7 +134,6 @@ public class AllClassesGetter {
}
public void handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) {
context.setAddCompletionChar(false);
_handleInsert(context, item);
item.getTailType().processTail(context.getEditor(), context.getEditor().getCaretModel().getOffset());
}
@@ -27,6 +27,7 @@ import com.intellij.psi.util.PsiTreeUtil;
public class JavaClassNameInsertHandler implements AllClassesGetter.ClassNameInsertHandler {
public AllClassesGetter.ClassNameInsertHandlerResult handleInsert(InsertionContext context,
JavaPsiClassReferenceElement item) {
context.setAddCompletionChar(false);
Editor editor = context.getEditor();
PsiFile file = context.getFile();
int endOffset = editor.getCaretModel().getOffset();
@@ -580,9 +580,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
});
}
else if (!AFTER_DOT.accepts(position)) {
superItem.setTailType(TailType.DOT);
}
result.addElement(superItem);
}
@@ -32,9 +32,8 @@ import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.find.FindManager;
import com.intellij.find.findUsages.FindUsagesHandler;
import com.intellij.find.findUsages.FindUsagesManager;
import com.intellij.find.findUsages.FindUsagesOptions;
import com.intellij.find.findUsages.JavaMethodFindUsagesOptions;
import com.intellij.find.impl.FindManagerImpl;
import com.intellij.ide.DataManager;
import com.intellij.ide.util.SuperMethodWarningUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.undo.UndoUtil;
@@ -144,12 +143,11 @@ public class ChangeMethodSignatureFromUsageFix implements IntentionAction {
final FindUsagesHandler handler = findUsagesManager.getFindUsagesHandler(method, false);
if (handler == null) return; //on failure or cancel (e.g. cancel of super methods dialog)
final FindUsagesOptions options = new FindUsagesOptions(project, editor == null? null : DataManager.getInstance().getDataContext(editor.getComponent()));
final JavaMethodFindUsagesOptions options = new JavaMethodFindUsagesOptions(project);
options.isImplementingMethods = true;
options.isMethodsUsages = true;
options.isOverridingMethods = true;
options.isUsages = true;
options.isSearchForTextOccurences = false;
options.isSearchForTextOccurrences = false;
final int[] usagesFound = new int[1];
Runnable runnable = new Runnable() {
public void run() {
@@ -25,7 +25,7 @@ import com.intellij.ui.StateRestoringCheckBox;
import javax.swing.*;
public class FindClassUsagesDialog extends JavaFindUsagesDialog {
public class FindClassUsagesDialog extends JavaFindUsagesDialog<JavaClassFindUsagesOptions> {
private StateRestoringCheckBox myCbUsages;
private StateRestoringCheckBox myCbMethodsUsages;
private StateRestoringCheckBox myCbFieldsUsages;
@@ -43,7 +43,7 @@ public class FindClassUsagesDialog extends JavaFindUsagesDialog {
return myCbUsages;
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
public void calcFindUsagesOptions(JavaClassFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
if (isToChange(myCbUsages)){
@@ -75,19 +75,19 @@ public class FindClassUsagesDialog extends JavaFindUsagesDialog {
findWhatPanel.setBorder(IdeBorderFactory.createTitledBorder(FindBundle.message("find.what.group")));
findWhatPanel.setLayout(new BoxLayout(findWhatPanel, BoxLayout.Y_AXIS));
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), myFindUsagesOptions.isUsages, findWhatPanel, true);
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), getFindUsagesOptions().isUsages, findWhatPanel, true);
PsiClass psiClass = (PsiClass)getPsiElement();
myCbMethodsUsages = addCheckboxToPanel(FindBundle.message("find.what.methods.usages.checkbox"), myFindUsagesOptions.isMethodsUsages, findWhatPanel, true);
myCbMethodsUsages = addCheckboxToPanel(FindBundle.message("find.what.methods.usages.checkbox"), getFindUsagesOptions().isMethodsUsages, findWhatPanel, true);
if (!psiClass.isAnnotationType()) {
myCbFieldsUsages = addCheckboxToPanel(FindBundle.message("find.what.fields.usages.checkbox"), myFindUsagesOptions.isFieldsUsages, findWhatPanel, true);
myCbFieldsUsages = addCheckboxToPanel(FindBundle.message("find.what.fields.usages.checkbox"), getFindUsagesOptions().isFieldsUsages, findWhatPanel, true);
if (psiClass.isInterface()){
myCbImplementingClasses = addCheckboxToPanel(FindBundle.message("find.what.implementing.classes.checkbox"), myFindUsagesOptions.isImplementingClasses, findWhatPanel, true);
myCbDerivedInterfaces = addCheckboxToPanel(FindBundle.message("find.what.derived.interfaces.checkbox"), myFindUsagesOptions.isDerivedInterfaces, findWhatPanel, true);
myCbImplementingClasses = addCheckboxToPanel(FindBundle.message("find.what.implementing.classes.checkbox"), getFindUsagesOptions().isImplementingClasses, findWhatPanel, true);
myCbDerivedInterfaces = addCheckboxToPanel(FindBundle.message("find.what.derived.interfaces.checkbox"), getFindUsagesOptions().isDerivedInterfaces, findWhatPanel, true);
}
else if (!psiClass.hasModifierProperty(PsiModifier.FINAL)){
myCbDerivedClasses = addCheckboxToPanel(FindBundle.message("find.what.derived.classes.checkbox"), myFindUsagesOptions.isDerivedClasses, findWhatPanel, true);
myCbDerivedClasses = addCheckboxToPanel(FindBundle.message("find.what.derived.classes.checkbox"), getFindUsagesOptions().isDerivedClasses, findWhatPanel, true);
}
}
return findWhatPanel;
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class FindMethodUsagesDialog extends JavaFindUsagesDialog {
public class FindMethodUsagesDialog extends JavaFindUsagesDialog<JavaMethodFindUsagesOptions> {
private StateRestoringCheckBox myCbUsages;
private StateRestoringCheckBox myCbImplementingMethods;
private StateRestoringCheckBox myCbOverridingMethods;
@@ -41,7 +41,7 @@ public class FindMethodUsagesDialog extends JavaFindUsagesDialog {
return myHasFindWhatPanel ? myCbUsages : null;
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
public void calcFindUsagesOptions(JavaMethodFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
options.isUsages = isSelected(myCbUsages) || !myHasFindWhatPanel;
@@ -59,7 +59,7 @@ public class FindMethodUsagesDialog extends JavaFindUsagesDialog {
findWhatPanel.setBorder(IdeBorderFactory.createTitledBorder(FindBundle.message("find.what.group")));
findWhatPanel.setLayout(new BoxLayout(findWhatPanel, BoxLayout.Y_AXIS));
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), myFindUsagesOptions.isUsages, findWhatPanel, true);
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), getFindUsagesOptions().isUsages, findWhatPanel, true);
PsiMethod method = (PsiMethod) getPsiElement();
PsiClass aClass = method.getContainingClass();
@@ -71,9 +71,9 @@ public class FindMethodUsagesDialog extends JavaFindUsagesDialog {
!(aClass instanceof PsiAnonymousClass) &&
!aClass.hasModifierProperty(PsiModifier.FINAL)) {
if (method.hasModifierProperty(PsiModifier.ABSTRACT)) {
myCbImplementingMethods = addCheckboxToPanel(FindBundle.message("find.what.implementing.methods.checkbox"), myFindUsagesOptions.isImplementingMethods, findWhatPanel, true);
myCbImplementingMethods = addCheckboxToPanel(FindBundle.message("find.what.implementing.methods.checkbox"), getFindUsagesOptions().isImplementingMethods, findWhatPanel, true);
} else {
myCbOverridingMethods = addCheckboxToPanel(FindBundle.message("find.what.overriding.methods.checkbox"), myFindUsagesOptions.isOverridingMethods, findWhatPanel, true);
myCbOverridingMethods = addCheckboxToPanel(FindBundle.message("find.what.overriding.methods.checkbox"), getFindUsagesOptions().isOverridingMethods, findWhatPanel, true);
}
} else {
myHasFindWhatPanel = false;
@@ -23,7 +23,7 @@ import com.intellij.ui.StateRestoringCheckBox;
import javax.swing.*;
public class FindPackageUsagesDialog extends JavaFindUsagesDialog {
public class FindPackageUsagesDialog extends JavaFindUsagesDialog<JavaPackageFindUsagesOptions> {
private StateRestoringCheckBox myCbUsages;
private StateRestoringCheckBox myCbClassesUsages;
@@ -39,7 +39,7 @@ public class FindPackageUsagesDialog extends JavaFindUsagesDialog {
return myCbUsages;
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
public void calcFindUsagesOptions(JavaPackageFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
options.isUsages = isSelected(myCbUsages);
@@ -55,8 +55,8 @@ public class FindPackageUsagesDialog extends JavaFindUsagesDialog {
findWhatPanel.setBorder(IdeBorderFactory.createTitledBorder(FindBundle.message("find.what.group")));
findWhatPanel.setLayout(new BoxLayout(findWhatPanel, BoxLayout.Y_AXIS));
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), myFindUsagesOptions.isUsages, findWhatPanel, true);
myCbClassesUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.of.classes.and.interfaces"), myFindUsagesOptions.isClassesUsages, findWhatPanel, true);
myCbUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.checkbox"), getFindUsagesOptions().isUsages, findWhatPanel, true);
myCbClassesUsages = addCheckboxToPanel(FindBundle.message("find.what.usages.of.classes.and.interfaces"), getFindUsagesOptions().isClassesUsages, findWhatPanel, true);
return findWhatPanel;
}
@@ -25,7 +25,7 @@ import com.intellij.ui.StateRestoringCheckBox;
import javax.swing.*;
import java.awt.*;
public class FindThrowUsagesDialog extends JavaFindUsagesDialog {
public class FindThrowUsagesDialog extends JavaFindUsagesDialog<JavaThrowFindUsagesOptions> {
private StateRestoringCheckBox myCbUsages;
private JComboBox myCbExns;
private boolean myHasFindWhatPanel;
@@ -62,10 +62,9 @@ public class FindThrowUsagesDialog extends JavaFindUsagesDialog {
return panel;
}
public void calcFindUsagesOptions(final FindUsagesOptions options) {
public void calcFindUsagesOptions(final JavaThrowFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
options.isUsages = isSelected(myCbUsages) || !myHasFindWhatPanel;
options.isThrowUsages = true;
}
protected JPanel createFindWhatPanel() {
@@ -21,7 +21,7 @@ import com.intellij.psi.PsiField;
import javax.swing.*;
public class FindVariableUsagesDialog extends JavaFindUsagesDialog {
public class FindVariableUsagesDialog extends JavaFindUsagesDialog<JavaVariableFindUsagesOptions> {
public FindVariableUsagesDialog(PsiElement element, Project project, FindUsagesOptions findUsagesOptions,
boolean toShowInNewTab, boolean mustOpenInNewTab, boolean isSingleFile, FindUsagesHandler handler){
@@ -32,7 +32,7 @@ public class FindVariableUsagesDialog extends JavaFindUsagesDialog {
return myCbToSkipResultsWhenOneUsage;
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
public void calcFindUsagesOptions(JavaVariableFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
options.isReadAccess = true;
@@ -0,0 +1,70 @@
package com.intellij.find.findUsages;
import com.intellij.find.FindBundle;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
/**
* @author peter
*/
public class JavaClassFindUsagesOptions extends JavaFindUsagesOptions {
public boolean isMethodsUsages = false;
public boolean isFieldsUsages = false;
public boolean isDerivedClasses = false;
public boolean isImplementingClasses = false;
public boolean isDerivedInterfaces = false;
public boolean isCheckDeepInheritance = true;
public boolean isIncludeInherited = false;
public JavaClassFindUsagesOptions(@NotNull Project project) {
super(project);
}
protected void addUsageTypes(LinkedHashSet<String> strings) {
if (this.isUsages || this.isMethodsUsages || this.isFieldsUsages) {
strings.add(FindBundle.message("find.usages.panel.title.usages"));
}
if (this.isDerivedClasses) {
strings.add(FindBundle.message("find.usages.panel.title.derived.classes"));
}
if (this.isImplementingClasses) {
strings.add(FindBundle.message("find.usages.panel.title.implementing.classes"));
}
if (this.isDerivedInterfaces) {
strings.add(FindBundle.message("find.usages.panel.title.derived.interfaces"));
}
}
public boolean equals(final Object o) {
if (this == o) return true;
if (!super.equals(this)) return false;
if (o == null || getClass() != o.getClass()) return false;
final JavaClassFindUsagesOptions that = (JavaClassFindUsagesOptions)o;
if (isCheckDeepInheritance != that.isCheckDeepInheritance) return false;
if (isDerivedClasses != that.isDerivedClasses) return false;
if (isDerivedInterfaces != that.isDerivedInterfaces) return false;
if (isFieldsUsages != that.isFieldsUsages) return false;
if (isImplementingClasses != that.isImplementingClasses) return false;
if (isIncludeInherited != that.isIncludeInherited) return false;
if (isMethodsUsages != that.isMethodsUsages) return false;
return true;
}
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isMethodsUsages ? 1 : 0);
result = 31 * result + (isFieldsUsages ? 1 : 0);
result = 31 * result + (isDerivedClasses ? 1 : 0);
result = 31 * result + (isImplementingClasses ? 1 : 0);
result = 31 * result + (isDerivedInterfaces ? 1 : 0);
result = 31 * result + (isCheckDeepInheritance ? 1 : 0);
result = 31 * result + (isIncludeInherited ? 1 : 0);
return result;
}
}
@@ -30,7 +30,7 @@ import com.intellij.usageView.UsageViewUtil;
import javax.swing.*;
public abstract class JavaFindUsagesDialog extends AbstractFindUsagesDialog {
public abstract class JavaFindUsagesDialog<T extends JavaFindUsagesOptions> extends AbstractFindUsagesDialog {
protected final PsiElement myPsiElement;
private StateRestoringCheckBox myCbIncludeOverloadedMethods;
private boolean myIncludeOverloadedMethodsAvailable = false;
@@ -48,10 +48,16 @@ public abstract class JavaFindUsagesDialog extends AbstractFindUsagesDialog {
return FindUsagesUtil.isSearchForTextOccurencesAvailable(element, isSingleFile, handler);
}
public void calcFindUsagesOptions(T options) {
if (options instanceof JavaMethodFindUsagesOptions) {
((JavaMethodFindUsagesOptions)options).isIncludeOverloadUsages =
myIncludeOverloadedMethodsAvailable && isToChange(myCbIncludeOverloadedMethods) && myCbIncludeOverloadedMethods.isSelected();
}
}
public void calcFindUsagesOptions(FindUsagesOptions options) {
super.calcFindUsagesOptions(options);
options.isIncludeOverloadUsages =
myIncludeOverloadedMethodsAvailable && isToChange(myCbIncludeOverloadedMethods) && myCbIncludeOverloadedMethods.isSelected();
calcFindUsagesOptions((T)options);
}
protected void doOKAction() {
@@ -95,4 +101,8 @@ public abstract class JavaFindUsagesDialog extends AbstractFindUsagesDialog {
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(FindUsagesManager.getHelpID(myPsiElement));
}
protected T getFindUsagesOptions() {
return (T)myFindUsagesOptions;
}
}
@@ -62,55 +62,36 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
public static final String ACTION_STRING = FindBundle.message("find.super.method.warning.action.verb");
private final PsiElement[] myElementsToSearch;
private final FindUsagesOptions myFindPackageOptions;
private final FindUsagesOptions myFindClassOptions;
private final FindUsagesOptions myFindMethodOptions;
private final FindUsagesOptions myFindVariableOptions;
private final FindUsagesOptions myFindThrowOptions;
private final JavaFindUsagesHandlerFactory myFactory;
public JavaFindUsagesHandler(@NotNull PsiElement psiElement,
@NotNull FindUsagesOptions findClassOptions,
@NotNull FindUsagesOptions findMethodOptions,
@NotNull FindUsagesOptions findPackageOptions,
@NotNull FindUsagesOptions findThrowOptions,
@NotNull FindUsagesOptions findVariableOptions) {
this(psiElement, PsiElement.EMPTY_ARRAY, findClassOptions, findMethodOptions, findPackageOptions, findThrowOptions, findVariableOptions);
public JavaFindUsagesHandler(@NotNull PsiElement psiElement, JavaFindUsagesHandlerFactory factory) {
this(psiElement, PsiElement.EMPTY_ARRAY, factory);
}
public JavaFindUsagesHandler(@NotNull PsiElement psiElement,
@NotNull PsiElement[] elementsToSearch,
@NotNull FindUsagesOptions findClassOptions,
@NotNull FindUsagesOptions findMethodOptions,
@NotNull FindUsagesOptions findPackageOptions,
@NotNull FindUsagesOptions findThrowOptions,
@NotNull FindUsagesOptions findVariableOptions) {
public JavaFindUsagesHandler(@NotNull PsiElement psiElement, @NotNull PsiElement[] elementsToSearch, JavaFindUsagesHandlerFactory factory) {
super(psiElement);
myElementsToSearch = elementsToSearch;
myFindClassOptions = findClassOptions;
myFindMethodOptions = findMethodOptions;
myFindPackageOptions = findPackageOptions;
myFindThrowOptions = findThrowOptions;
myFindVariableOptions = findVariableOptions;
myFactory = factory;
}
@NotNull
public AbstractFindUsagesDialog getFindUsagesDialog(boolean isSingleFile, boolean toShowInNewTab, boolean mustOpenInNewTab) {
PsiElement element = getPsiElement();
if (element instanceof PsiPackage) {
return new FindPackageUsagesDialog(element, getProject(), myFindPackageOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
return new FindPackageUsagesDialog(element, getProject(), myFactory.getFindPackageOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
}
if (element instanceof PsiClass) {
return new FindClassUsagesDialog(element, getProject(), myFindClassOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
return new FindClassUsagesDialog(element, getProject(), myFactory.getFindClassOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
}
if (element instanceof PsiMethod) {
return new FindMethodUsagesDialog(element, getProject(), myFindMethodOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
return new FindMethodUsagesDialog(element, getProject(), myFactory.getFindMethodOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
}
if (element instanceof PsiVariable) {
return new FindVariableUsagesDialog(element, getProject(), myFindVariableOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
return new FindVariableUsagesDialog(element, getProject(), myFactory.getFindVariableOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
}
if (ThrowSearchUtil.isSearchable(element)) {
return new FindThrowUsagesDialog(element, getProject(), myFindThrowOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
return new FindThrowUsagesDialog(element, getProject(), myFactory.getFindThrowOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this);
}
return super.getFindUsagesDialog(isSingleFile, toShowInNewTab, mustOpenInNewTab);
}
@@ -206,19 +187,19 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
public FindUsagesOptions getFindUsagesOptions() {
PsiElement element = getPsiElement();
if (element instanceof PsiPackage) {
return myFindPackageOptions;
return myFactory.getFindPackageOptions();
}
if (element instanceof PsiClass) {
return myFindClassOptions;
return myFactory.getFindClassOptions();
}
if (element instanceof PsiMethod) {
return myFindMethodOptions;
return myFactory.getFindMethodOptions();
}
if (element instanceof PsiVariable) {
return myFindVariableOptions;
return myFactory.getFindVariableOptions();
}
if (ThrowSearchUtil.isSearchable(element)) {
return myFindThrowOptions;
return myFactory.getFindThrowOptions();
}
return super.getFindUsagesOptions();
}
@@ -264,10 +245,10 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
@Override
public void processElementUsages(@NotNull final PsiElement element, @NotNull final Processor<UsageInfo> processor, @NotNull final FindUsagesOptions options) {
if (element instanceof PsiVariable){
if (options.isReadAccess || options.isWriteAccess){
if (options.isReadAccess && options.isWriteAccess){
//todo[myakovlev] this also shows param in javadoc (PsiDocParamRef), but should not
if (options instanceof JavaVariableFindUsagesOptions) {
final JavaVariableFindUsagesOptions varOptions = (JavaVariableFindUsagesOptions) options;
if (varOptions.isReadAccess || varOptions.isWriteAccess){
if (varOptions.isReadAccess && varOptions.isWriteAccess){
addElementUsages(element, processor, options);
}
else{
@@ -275,12 +256,12 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
public boolean process(UsageInfo info) {
final PsiElement element = info.getElement();
boolean isWrite = element instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression)element);
if (isWrite == options.isWriteAccess) {
if (isWrite == varOptions.isWriteAccess) {
if (!processor.process(info)) return false;
}
return true;
}
}, options);
}, varOptions);
}
}
}
@@ -290,7 +271,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
if (ThrowSearchUtil.isSearchable (element) && options.isThrowUsages) {
if (ThrowSearchUtil.isSearchable (element) && options instanceof JavaThrowFindUsagesOptions && options.isUsages) {
ThrowSearchUtil.Root root = options.getUserData(ThrowSearchUtil.THROW_SEARCH_ROOT_KEY);
if (root == null) {
final ThrowSearchUtil.Root[] roots = ThrowSearchUtil.getSearchRoots(element);
@@ -305,67 +286,70 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
});
if (element instanceof PsiPackage && options.isClassesUsages){
addClassesUsages((PsiPackage)element, processor, options);
if (options instanceof JavaPackageFindUsagesOptions && ((JavaPackageFindUsagesOptions)options).isClassesUsages){
addClassesUsages((PsiPackage)element, processor, (JavaPackageFindUsagesOptions)options);
}
if (element instanceof PsiClass && options.isMethodsUsages){
addMethodsUsages((PsiClass)element, processor, options);
}
if (element instanceof PsiClass && options.isFieldsUsages){
addFieldsUsages((PsiClass)element, processor, options);
}
if (element instanceof PsiClass){
if (((PsiClass)element).isInterface()) {
if (options.isDerivedInterfaces){
if (options.isImplementingClasses){
addInheritors((PsiClass)element, processor, options);
if (options instanceof JavaClassFindUsagesOptions) {
final JavaClassFindUsagesOptions classOptions = (JavaClassFindUsagesOptions)options;
final PsiClass psiClass = (PsiClass)element;
if (classOptions.isMethodsUsages){
addMethodsUsages(psiClass, processor, classOptions);
}
if (classOptions.isFieldsUsages){
addFieldsUsages(psiClass, processor, classOptions);
}
if (psiClass.isInterface()) {
if (classOptions.isDerivedInterfaces){
if (classOptions.isImplementingClasses){
addInheritors(psiClass, processor, classOptions);
}
else{
addDerivedInterfaces((PsiClass)element, processor, options);
addDerivedInterfaces(psiClass, processor, classOptions);
}
}
else if (options.isImplementingClasses){
addImplementingClasses((PsiClass)element, processor, options);
else if (classOptions.isImplementingClasses){
addImplementingClasses(psiClass, processor, classOptions);
}
}
else if (options.isDerivedClasses) {
addInheritors((PsiClass)element, processor, options);
else if (classOptions.isDerivedClasses) {
addInheritors(psiClass, processor, classOptions);
}
}
if (element instanceof PsiMethod){
if (options instanceof JavaMethodFindUsagesOptions){
final PsiMethod psiMethod = (PsiMethod)element;
boolean isAbstract = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
public Boolean compute() {
return psiMethod.hasModifierProperty(PsiModifier.ABSTRACT);
}
});
if (isAbstract && options.isImplementingMethods || options.isOverridingMethods) {
processOverridingMethods(psiMethod, processor, options);
final JavaMethodFindUsagesOptions methodOptions = (JavaMethodFindUsagesOptions)options;
if (isAbstract && methodOptions.isImplementingMethods || methodOptions.isOverridingMethods) {
processOverridingMethods(psiMethod, processor, methodOptions);
}
}
if (!ThrowSearchUtil.isSearchable(element) && options.isSearchForTextOccurences && options.searchScope instanceof GlobalSearchScope) {
if (!ThrowSearchUtil.isSearchable(element) && options.isSearchForTextOccurrences && options.searchScope instanceof GlobalSearchScope) {
// todo add to fastTrack
processUsagesInText(element, processor, (GlobalSearchScope)options.searchScope);
}
}
private static void processOverridingMethods(PsiMethod psiMethod, final Processor<UsageInfo> processor, final FindUsagesOptions options) {
private static void processOverridingMethods(PsiMethod psiMethod, final Processor<UsageInfo> processor, final JavaMethodFindUsagesOptions options) {
OverridingMethodsSearch.search(psiMethod, options.searchScope, options.isCheckDeepInheritance).forEach(new PsiElementProcessorAdapter<PsiMethod>(
new PsiElementProcessor<PsiMethod>() {
public boolean execute(PsiMethod element) {
addResult(processor, element.getNavigationElement(), options, null);
addResult(processor, element.getNavigationElement(), options);
return true;
}
}));
}
private static void addClassesUsages(PsiPackage aPackage, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addClassesUsages(PsiPackage aPackage, final Processor<UsageInfo> results, final JavaPackageFindUsagesOptions options) {
final HashSet<PsiFile> filesSet = new HashSet<PsiFile>();
final ArrayList<PsiFile> files = new ArrayList<PsiFile>();
ReferencesSearch.search(new ReferencesSearch.SearchParameters(aPackage, options.searchScope, false, options.fastTrack)).forEach(new ReadActionProcessor<PsiReference>() {
@@ -396,7 +380,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
ReferencesSearch.search(new ReferencesSearch.SearchParameters(aClass, new LocalSearchScope(file), false, options.fastTrack)).forEach(new ReadActionProcessor<PsiReference>() {
public boolean processInReadAction(final PsiReference psiReference) {
return addResult(results, psiReference, options, aClass);
return addResult(results, psiReference, options);
}
});
}
@@ -429,7 +413,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
});
}
private static void addMethodsUsages(final PsiClass aClass, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addMethodsUsages(final PsiClass aClass, final Processor<UsageInfo> results, final JavaClassFindUsagesOptions options) {
if (options.isIncludeInherited) {
final PsiManager manager = aClass.getManager();
PsiMethod[] methods = aClass.getAllMethods();
@@ -446,10 +430,9 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
addElementUsages(methods[i], results, options);
}
else{
boolean strictSignatureSearch = !options.isIncludeOverloadUsages;
MethodReferencesSearch.search(new MethodReferencesSearch.SearchParameters(method, options.searchScope, strictSignatureSearch, options.fastTrack)).forEach(new PsiReferenceProcessorAdapter(new PsiReferenceProcessor() {
MethodReferencesSearch.search(new MethodReferencesSearch.SearchParameters(method, options.searchScope, true, options.fastTrack)).forEach(new PsiReferenceProcessorAdapter(new PsiReferenceProcessor() {
public boolean execute(PsiReference reference) {
addResultFromReference(reference, methodClass, manager, aClass, results, options, method);
addResultFromReference(reference, methodClass, manager, aClass, results, options);
return true;
}
}));
@@ -463,7 +446,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
}
private static void addFieldsUsages(final PsiClass aClass, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addFieldsUsages(final PsiClass aClass, final Processor<UsageInfo> results, final JavaClassFindUsagesOptions options) {
if (options.isIncludeInherited) {
final PsiManager manager = aClass.getManager();
PsiField[] fields = aClass.getAllFields();
@@ -481,7 +464,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
else {
ReferencesSearch.search(new ReferencesSearch.SearchParameters(field, options.searchScope, false, options.fastTrack)).forEach(new ReadActionProcessor<PsiReference>() {
public boolean processInReadAction(final PsiReference reference) {
addResultFromReference(reference, fieldClass, manager, aClass, results, options, field);
addResultFromReference(reference, fieldClass, manager, aClass, results, options);
return true;
}
});
@@ -528,23 +511,23 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
return null;
}
private static void addInheritors(final PsiClass aClass, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addInheritors(final PsiClass aClass, final Processor<UsageInfo> results, final JavaClassFindUsagesOptions options) {
ClassInheritorsSearch.search(aClass, options.searchScope, options.isCheckDeepInheritance).forEach(new PsiElementProcessorAdapter<PsiClass>(
new PsiElementProcessor<PsiClass>() {
public boolean execute(PsiClass element) {
addResult(results, element, options, null);
addResult(results, element, options);
return true;
}
}));
}
private static void addDerivedInterfaces(PsiClass anInterface, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addDerivedInterfaces(PsiClass anInterface, final Processor<UsageInfo> results, final JavaClassFindUsagesOptions options) {
ClassInheritorsSearch.search(anInterface, options.searchScope, options.isCheckDeepInheritance).forEach(new PsiElementProcessorAdapter<PsiClass>(
new PsiElementProcessor<PsiClass>() {
public boolean execute(PsiClass inheritor) {
if (inheritor.isInterface()) {
addResult(results, inheritor, options, null);
addResult(results, inheritor, options);
}
return true;
}
@@ -552,12 +535,12 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}));
}
private static void addImplementingClasses(PsiClass anInterface, final Processor<UsageInfo> results, final FindUsagesOptions options) {
private static void addImplementingClasses(PsiClass anInterface, final Processor<UsageInfo> results, final JavaClassFindUsagesOptions options) {
ClassInheritorsSearch.search(anInterface, options.searchScope, options.isCheckDeepInheritance).forEach(new PsiElementProcessorAdapter<PsiClass>(
new PsiElementProcessor<PsiClass>() {
public boolean execute(PsiClass inheritor) {
if (!inheritor.isInterface()) {
addResult(results, inheritor, options, null);
addResult(results, inheritor, options);
}
return true;
}
@@ -570,14 +553,13 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
final PsiManager manager,
final PsiClass aClass,
final Processor<UsageInfo> results,
final FindUsagesOptions options,
final PsiElement element) {
final FindUsagesOptions options) {
PsiElement refElement = reference.getElement();
if (refElement instanceof PsiReferenceExpression) {
PsiClass usedClass = getFieldOrMethodAccessedClass((PsiReferenceExpression)refElement, methodClass);
if (usedClass != null) {
if (manager.areElementsEquivalent(usedClass, aClass) || usedClass.isInheritor(aClass, true)) {
addResult(results, refElement, options, element);
addResult(results, refElement, options);
}
}
}
@@ -590,9 +572,9 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
final PsiClass parentClass = method.getContainingClass();
if (parentClass != null) {
MethodReferencesSearch.search(new MethodReferencesSearch.SearchParameters(method, searchScope, !options.isIncludeOverloadUsages, options.fastTrack)).forEach(new ReadActionProcessor<PsiReference>() {
MethodReferencesSearch.search(new MethodReferencesSearch.SearchParameters(method, searchScope, !((JavaMethodFindUsagesOptions)options).isIncludeOverloadUsages, options.fastTrack)).forEach(new ReadActionProcessor<PsiReference>() {
public boolean processInReadAction(final PsiReference ref) {
return addResult(result, ref, options, parentClass);
return addResult(result, ref, options);
}
});
}
@@ -601,37 +583,37 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
final ReadActionProcessor<PsiReference> consumer = new ReadActionProcessor<PsiReference>() {
public boolean processInReadAction(final PsiReference ref) {
return addResult(result, ref, options, element);
return addResult(result, ref, options);
}
};
if (element instanceof PsiMethod) {
final boolean strictSignatureSearch = !options.isIncludeOverloadUsages;
final boolean strictSignatureSearch = !((JavaMethodFindUsagesOptions)options).isIncludeOverloadUsages;
MethodReferencesSearch.search(new MethodReferencesSearch.SearchParameters((PsiMethod)element, searchScope, strictSignatureSearch, options.fastTrack)).forEach(consumer);
} else {
ReferencesSearch.search(new ReferencesSearch.SearchParameters(element, searchScope, false, options.fastTrack)).forEach(consumer);
}
}
public static void addResult(Processor<UsageInfo> total, PsiElement element, FindUsagesOptions options, PsiElement refElement) {
if (filterUsage(element, options, refElement)){
public static void addResult(Processor<UsageInfo> total, PsiElement element, FindUsagesOptions options) {
if (filterUsage(element, options)){
total.process(new UsageInfo(element));
}
}
public static boolean addResult(Processor<UsageInfo> results, PsiReference ref, FindUsagesOptions options, PsiElement refElement) {
if (filterUsage(ref.getElement(), options, refElement)){
public static boolean addResult(Processor<UsageInfo> results, PsiReference ref, FindUsagesOptions options) {
if (filterUsage(ref.getElement(), options)){
TextRange rangeInElement = ref.getRangeInElement();
return results.process(new UsageInfo(ref.getElement(), rangeInElement.getStartOffset(), rangeInElement.getEndOffset(), false));
}
return true;
}
private static boolean filterUsage(PsiElement usage, FindUsagesOptions options, PsiElement refElement) {
private static boolean filterUsage(PsiElement usage, FindUsagesOptions options) {
if (!(usage instanceof PsiJavaCodeReferenceElement)) {
return true;
}
if (refElement instanceof PsiPackage && !options.isIncludeSubpackages &&
if (options instanceof JavaPackageFindUsagesOptions && !((JavaPackageFindUsagesOptions)options).isIncludeSubpackages &&
((PsiReference)usage).resolve() instanceof PsiPackage) {
PsiElement parent = usage.getParent();
if (parent instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)parent).resolve() instanceof PsiPackage) {
@@ -640,7 +622,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
if (!(usage instanceof PsiReferenceExpression)){
if (options.isSkipImportStatements){
if (options instanceof JavaFindUsagesOptions && ((JavaFindUsagesOptions)options).isSkipImportStatements){
PsiElement parent = usage.getParent();
while(parent instanceof PsiJavaCodeReferenceElement){
parent = parent.getParent();
@@ -650,7 +632,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
}
if (options.isSkipPackageStatements){
if (options instanceof JavaPackageFindUsagesOptions && ((JavaPackageFindUsagesOptions)options).isSkipPackageStatements){
PsiElement parent = usage.getParent();
while(parent instanceof PsiJavaCodeReferenceElement){
parent = parent.getParent();
@@ -27,38 +27,22 @@ import org.jetbrains.annotations.NotNull;
* @author peter
*/
public class JavaFindUsagesHandlerFactory extends FindUsagesHandlerFactory {
private final FindUsagesOptions myFindClassOptions;
private final FindUsagesOptions myFindMethodOptions;
private final FindUsagesOptions myFindPackageOptions;
private final FindUsagesOptions myFindThrowOptions;
private final FindUsagesOptions myFindVariableOptions;
private final JavaClassFindUsagesOptions myFindClassOptions;
private final JavaMethodFindUsagesOptions myFindMethodOptions;
private final JavaPackageFindUsagesOptions myFindPackageOptions;
private final JavaThrowFindUsagesOptions myFindThrowOptions;
private final JavaVariableFindUsagesOptions myFindVariableOptions;
public static JavaFindUsagesHandlerFactory getInstance(@NotNull Project project) {
return ContainerUtil.findInstance(Extensions.getExtensions(EP_NAME, project), JavaFindUsagesHandlerFactory.class);
}
public JavaFindUsagesHandlerFactory(Project project) {
final FindUsagesOptions findClassOptions = FindUsagesHandler.createFindUsagesOptions(project);
final FindUsagesOptions findMethodOptions = FindUsagesHandler.createFindUsagesOptions(project);
findMethodOptions.isCheckDeepInheritance = false;
findMethodOptions.isIncludeSubpackages = false;
findMethodOptions.isSearchForTextOccurences = false;
final FindUsagesOptions findPackageOptions = FindUsagesHandler.createFindUsagesOptions(project);
final FindUsagesOptions findThrowOptions = FindUsagesHandler.createFindUsagesOptions(project);
findThrowOptions.isSearchForTextOccurences = false;
findThrowOptions.isThrowUsages = true;
final FindUsagesOptions findVariableOptions = FindUsagesHandler.createFindUsagesOptions(project);
findVariableOptions.isCheckDeepInheritance = false;
findVariableOptions.isIncludeSubpackages = false;
findVariableOptions.isSearchForTextOccurences = false;
myFindClassOptions = findClassOptions;
myFindMethodOptions = findMethodOptions;
myFindPackageOptions = findPackageOptions;
myFindThrowOptions = findThrowOptions;
myFindVariableOptions = findVariableOptions;
myFindClassOptions = new JavaClassFindUsagesOptions(project);
myFindMethodOptions = new JavaMethodFindUsagesOptions(project);
myFindPackageOptions = new JavaPackageFindUsagesOptions(project);
myFindThrowOptions = new JavaThrowFindUsagesOptions(project);
myFindVariableOptions = new JavaVariableFindUsagesOptions(project);
}
public boolean canFindUsages(@NotNull final PsiElement element) {
@@ -68,46 +52,40 @@ public class JavaFindUsagesHandlerFactory extends FindUsagesHandlerFactory {
public FindUsagesHandler createFindUsagesHandler(@NotNull final PsiElement element, final boolean forHighlightUsages) {
if (element instanceof PsiDirectory) {
final PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory)element);
return psiPackage == null
? null
: new JavaFindUsagesHandler(psiPackage, myFindClassOptions, myFindMethodOptions, myFindPackageOptions, myFindThrowOptions,
myFindVariableOptions);
return psiPackage == null ? null : new JavaFindUsagesHandler(psiPackage, this);
}
if (element instanceof PsiMethod && !forHighlightUsages) {
final PsiMethod[] methods = SuperMethodWarningUtil.checkSuperMethods((PsiMethod)element, JavaFindUsagesHandler.ACTION_STRING);
if (methods.length > 1) {
return new JavaFindUsagesHandler(element, methods, myFindClassOptions, myFindMethodOptions, myFindPackageOptions,
myFindThrowOptions, myFindVariableOptions);
return new JavaFindUsagesHandler(element, methods, this);
}
if (methods.length == 1) {
return new JavaFindUsagesHandler(methods[0], myFindClassOptions, myFindMethodOptions, myFindPackageOptions, myFindThrowOptions,
myFindVariableOptions);
return new JavaFindUsagesHandler(methods[0], this);
}
return FindUsagesHandler.NULL_HANDLER;
}
return new JavaFindUsagesHandler(element, myFindClassOptions, myFindMethodOptions, myFindPackageOptions, myFindThrowOptions,
myFindVariableOptions);
return new JavaFindUsagesHandler(element, this);
}
public FindUsagesOptions getFindClassOptions() {
public JavaClassFindUsagesOptions getFindClassOptions() {
return myFindClassOptions;
}
public FindUsagesOptions getFindMethodOptions() {
public JavaMethodFindUsagesOptions getFindMethodOptions() {
return myFindMethodOptions;
}
public FindUsagesOptions getFindPackageOptions() {
public JavaPackageFindUsagesOptions getFindPackageOptions() {
return myFindPackageOptions;
}
public FindUsagesOptions getFindThrowOptions() {
public JavaThrowFindUsagesOptions getFindThrowOptions() {
return myFindThrowOptions;
}
public FindUsagesOptions getFindVariableOptions() {
public JavaVariableFindUsagesOptions getFindVariableOptions() {
return myFindVariableOptions;
}
}
@@ -0,0 +1,54 @@
package com.intellij.find.findUsages;
import com.intellij.find.FindBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
/**
* @author peter
*/
public abstract class JavaFindUsagesOptions extends FindUsagesOptions {
public boolean isSkipImportStatements = false;
public JavaFindUsagesOptions(@NotNull Project project) {
super(project, null);
isUsages = true;
}
public boolean equals(final Object o) {
if (this == o) return true;
if (!super.equals(this)) return false;
if (o == null || getClass() != o.getClass()) return false;
return isSkipImportStatements == ((JavaFindUsagesOptions)o).isSkipImportStatements;
}
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isSkipImportStatements ? 1 : 0);
return result;
}
protected void addUsageTypes(LinkedHashSet<String> to) {
if (this.isUsages) {
to.add(FindBundle.message("find.usages.panel.title.usages"));
}
}
@Override
public final String generateUsagesString() {
String suffix = " " + FindBundle.message("find.usages.panel.title.separator") + " ";
LinkedHashSet<String> strings = new LinkedHashSet<String>();
addUsageTypes(strings);
if (strings.isEmpty()) {
strings.add(FindBundle.message("find.usages.panel.title.usages"));
}
return StringUtil.join(strings, suffix);
}
}
@@ -0,0 +1,64 @@
package com.intellij.find.findUsages;
import com.intellij.find.FindBundle;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
/**
* @author peter
*/
public class JavaMethodFindUsagesOptions extends JavaFindUsagesOptions {
public boolean isOverridingMethods = false;
public boolean isImplementingMethods = false;
public boolean isCheckDeepInheritance = true;
public boolean isIncludeInherited = false;
public boolean isIncludeOverloadUsages = false;
public JavaMethodFindUsagesOptions(@NotNull Project project) {
super(project);
isSearchForTextOccurrences = false;
}
public boolean equals(final Object o) {
if (this == o) return true;
if (!super.equals(this)) return false;
if (o == null || getClass() != o.getClass()) return false;
final JavaMethodFindUsagesOptions that = (JavaMethodFindUsagesOptions)o;
if (isCheckDeepInheritance != that.isCheckDeepInheritance) return false;
if (isImplementingMethods != that.isImplementingMethods) return false;
if (isIncludeInherited != that.isIncludeInherited) return false;
if (isIncludeOverloadUsages != that.isIncludeOverloadUsages) return false;
if (isOverridingMethods != that.isOverridingMethods) return false;
return true;
}
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isOverridingMethods ? 1 : 0);
result = 31 * result + (isImplementingMethods ? 1 : 0);
result = 31 * result + (isCheckDeepInheritance ? 1 : 0);
result = 31 * result + (isIncludeInherited ? 1 : 0);
result = 31 * result + (isIncludeOverloadUsages ? 1 : 0);
return result;
}
@Override
protected void addUsageTypes(LinkedHashSet<String> strings) {
super.addUsageTypes(strings);
if (this.isIncludeOverloadUsages) {
strings.add(FindBundle.message("find.usages.panel.title.overloaded.methods.usages"));
}
if (this.isImplementingMethods) {
strings.add(FindBundle.message("find.usages.panel.title.implementing.methods"));
}
if (this.isOverridingMethods) {
strings.add(FindBundle.message("find.usages.panel.title.overriding.methods"));
}
}
}
@@ -0,0 +1,49 @@
package com.intellij.find.findUsages;
import com.intellij.find.FindBundle;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
/**
* @author peter
*/
public class JavaPackageFindUsagesOptions extends JavaFindUsagesOptions {
public boolean isClassesUsages = false;
public boolean isIncludeSubpackages = true;
public boolean isSkipPackageStatements = false;
public JavaPackageFindUsagesOptions(@NotNull Project project) {
super(project);
}
protected void addUsageTypes(LinkedHashSet<String> to) {
if (this.isUsages || this.isClassesUsages) {
to.add(FindBundle.message("find.usages.panel.title.usages"));
}
}
public boolean equals(final Object o) {
if (this == o) return true;
if (!super.equals(this)) return false;
if (o == null || getClass() != o.getClass()) return false;
final JavaPackageFindUsagesOptions that = (JavaPackageFindUsagesOptions)o;
if (isClassesUsages != that.isClassesUsages) return false;
if (isIncludeSubpackages != that.isIncludeSubpackages) return false;
if (isSkipPackageStatements != that.isSkipPackageStatements) return false;
return true;
}
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isClassesUsages ? 1 : 0);
result = 31 * result + (isIncludeSubpackages ? 1 : 0);
result = 31 * result + (isSkipPackageStatements ? 1 : 0);
return result;
}
}
@@ -0,0 +1,16 @@
package com.intellij.find.findUsages;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class JavaThrowFindUsagesOptions extends JavaFindUsagesOptions {
public JavaThrowFindUsagesOptions(@NotNull Project project) {
super(project);
isSearchForTextOccurrences = false;
}
}
@@ -0,0 +1,38 @@
package com.intellij.find.findUsages;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class JavaVariableFindUsagesOptions extends JavaFindUsagesOptions {
public boolean isReadAccess = true;
public boolean isWriteAccess = true;
public JavaVariableFindUsagesOptions(@NotNull Project project) {
super(project);
isSearchForTextOccurrences = false;
}
public boolean equals(final Object o) {
if (this == o) return true;
if (!super.equals(this)) return false;
if (o == null || getClass() != o.getClass()) return false;
final JavaVariableFindUsagesOptions that = (JavaVariableFindUsagesOptions)o;
if (isReadAccess != that.isReadAccess) return false;
if (isWriteAccess != that.isWriteAccess) return false;
return true;
}
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isReadAccess ? 1 : 0);
result = 31 * result + (isWriteAccess ? 1 : 0);
return result;
}
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.java.stubs.JavaStubElementType;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.source.PsiJavaFileImpl;
import com.intellij.psi.impl.source.tree.JavaElementType;
import com.intellij.psi.tree.IElementType;
@@ -38,7 +39,6 @@ import org.jetbrains.annotations.NotNull;
* @author max
*/
public class JavaParserDefinition implements ParserDefinition {
private final TokenSet myStringLiteralElementSet = TokenSet.create(JavaElementType.LITERAL_EXPRESSION);
@NotNull
public Lexer createLexer(Project project) {
@@ -51,7 +51,7 @@ public class JavaParserDefinition implements ParserDefinition {
}
public IFileElementType getFileNodeType() {
return JavaElementType.JAVA_FILE;
return JavaStubElementTypes.JAVA_FILE;
}
@NotNull
@@ -66,7 +66,7 @@ public class JavaParserDefinition implements ParserDefinition {
@NotNull
public TokenSet getStringLiteralElements() {
return myStringLiteralElementSet;
return TokenSet.create(JavaElementType.LITERAL_EXPRESSION);
}
@NotNull
@@ -16,9 +16,7 @@
package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.LighterASTNode;
import com.intellij.lang.PsiBuilder;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.impl.source.tree.ElementType;
@@ -30,6 +28,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.lang.PsiBuilderUtil.expect;
import static com.intellij.lang.PsiBuilderUtil.nextTokenType;
import static com.intellij.lang.java.parser.JavaParserUtil.*;
@@ -38,18 +37,16 @@ public class DeclarationParser {
FILE, CLASS, CODE_BLOCK, ANNOTATION_INTERFACE
}
private static final Logger LOG = Logger.getInstance("#com.intellij.lang.java.parser.DeclarationParser");
private static final TokenSet AFTER_END_DECLARATION_SET = TokenSet.create(JavaElementType.FIELD, JavaElementType.METHOD);
private static final TokenSet BEFORE_LBRACE_ELEMENTS_SET = TokenSet.create(
JavaTokenType.IDENTIFIER, JavaTokenType.COMMA, JavaTokenType.EXTENDS_KEYWORD, JavaTokenType.IMPLEMENTS_KEYWORD);
private static final TokenSet APPEND_TO_METHOD_SET = TokenSet.create(
JavaTokenType.IDENTIFIER, JavaTokenType.COMMA, JavaTokenType.THROWS_KEYWORD);
private DeclarationParser() { }
@Nullable
public static PsiBuilder.Marker parseClassBodyWithBraces(final PsiBuilder builder, final boolean isAnnotation, final boolean isEnum) {
if (builder.getTokenType() != JavaTokenType.LBRACE) return null;
final PsiBuilder.Marker marker = builder.mark();
marker.drop();
public static void parseClassBodyWithBraces(final PsiBuilder builder, final boolean isAnnotation, final boolean isEnum) {
assert builder.getTokenType() == JavaTokenType.LBRACE : builder.getTokenType();
builder.advanceLexer();
final PsiBuilder builderWrapper = braceMatchingBuilder(builder);
@@ -59,15 +56,38 @@ public class DeclarationParser {
parseClassBodyDeclarations(builderWrapper, isAnnotation);
expectOrError(builder, JavaTokenType.RBRACE, JavaErrorMessages.message("expected.rbrace"));
return marker;
}
@Nullable
private static PsiBuilder.Marker parseClassFromKeyword(final PsiBuilder builder, final PsiBuilder.Marker start,
final boolean isAnnotation) {
// todo: implement
throw new UnsupportedOperationException(builder.toString() + start + isAnnotation);
private static PsiBuilder.Marker parseClassFromKeyword(final PsiBuilder builder, final PsiBuilder.Marker declaration,
final boolean isAnnotation) {
final IElementType keywordTokenType = builder.getTokenType();
assert ElementType.CLASS_KEYWORD_BIT_SET.contains(keywordTokenType) : keywordTokenType;
builder.advanceLexer();
final boolean isEnum = (keywordTokenType == JavaTokenType.ENUM_KEYWORD);
if (!expect(builder, JavaTokenType.IDENTIFIER)) {
error(builder, JavaErrorMessages.message("expected.identifier"));
declaration.drop();
return null;
}
ReferenceParser.parseTypeParameters(builder);
ReferenceParser.parseReferenceList(builder, JavaTokenType.EXTENDS_KEYWORD, JavaElementType.EXTENDS_LIST, JavaTokenType.COMMA);
ReferenceParser.parseReferenceList(builder, JavaTokenType.IMPLEMENTS_KEYWORD, JavaElementType.IMPLEMENTS_LIST, JavaTokenType.COMMA);
if (builder.getTokenType() != JavaTokenType.LBRACE) {
final PsiBuilder.Marker error = builder.mark();
while (BEFORE_LBRACE_ELEMENTS_SET.contains(builder.getTokenType())) {
builder.advanceLexer();
}
error.error(JavaErrorMessages.message("expected.lbrace"));
}
parseClassBodyWithBraces(builder, isAnnotation, isEnum);
declaration.done(JavaElementType.CLASS);
return declaration;
}
private static void parseEnumConstants(final PsiBuilder builder) {
@@ -89,6 +109,7 @@ public class DeclarationParser {
if (!expect(builder, JavaTokenType.COMMA)) {
if (builder.getTokenType() != null && builder.getTokenType() != JavaTokenType.SEMICOLON) {
error(builder, JavaErrorMessages.message("expected.comma.or.semicolon"));
return;
}
}
}
@@ -140,7 +161,7 @@ public class DeclarationParser {
continue;
}
final PsiBuilder.Marker declaration = parseDeclaration(builder, context);
final PsiBuilder.Marker declaration = parse(builder, context);
if (declaration != null) {
if (invalidElements != null) {
invalidElements.errorBefore(JavaErrorMessages.message("unexpected.token"), declaration);
@@ -166,7 +187,7 @@ public class DeclarationParser {
}
@Nullable
private static PsiBuilder.Marker parseDeclaration(final PsiBuilder builder, final Context context) {
public static PsiBuilder.Marker parse(final PsiBuilder builder, final Context context) {
final IElementType tokenType = builder.getTokenType();
if (tokenType == null) return null;
@@ -177,10 +198,8 @@ public class DeclarationParser {
if (context == Context.FILE) return null;
}
else if (tokenType instanceof ILazyParseableElementType) {
final PsiBuilder.Marker declaration = builder.mark();
declaration.drop();
builder.advanceLexer();
return declaration;
return null;
}
else if (!ElementType.MODIFIER_BIT_SET.contains(tokenType) &&
!ElementType.CLASS_KEYWORD_BIT_SET.contains(tokenType) &&
@@ -211,8 +230,8 @@ public class DeclarationParser {
while (builder.getTokenType() != null && builder.getTokenType() != JavaTokenType.RBRACE) {
final PsiBuilder.Marker position = builder.mark();
final PsiBuilder.Marker element = parseDeclaration(builder, Context.CLASS);
if (element != null && AFTER_END_DECLARATION_SET.contains(((LighterASTNode)element).getTokenType())) {
final PsiBuilder.Marker element = parse(builder, Context.CLASS);
if (element != null && AFTER_END_DECLARATION_SET.contains(exprType(element))) {
if (!declarationsAfterEnd) {
element.precede().error(JavaErrorMessages.message("expected.class.or.interface"));
}
@@ -276,7 +295,7 @@ public class DeclarationParser {
}
final PsiBuilder.Marker codeBlock = StatementParser.parseCodeBlock(builder);
LOG.assertTrue(codeBlock != null);
assert codeBlock != null : builder.getOriginalText();
if (typeParams != null) {
final PsiBuilder.Marker error = typeParams.precede();
@@ -294,6 +313,7 @@ public class DeclarationParser {
error = builder.mark();
}
error.error(JavaErrorMessages.message("expected.identifier.or.type"));
declaration.drop();
return modList;
}
@@ -347,11 +367,7 @@ public class DeclarationParser {
isEmpty = false;
}
else if (tokenType == JavaTokenType.AT) {
final PsiBuilder.Marker pos = builder.mark();
builder.advanceLexer();
final IElementType nextTokenType = builder.getTokenType();
pos.rollbackTo();
if (ElementType.KEYWORD_BIT_SET.contains(nextTokenType)) {
if (ElementType.KEYWORD_BIT_SET.contains(nextTokenType(builder))) {
break;
}
parseAnnotation(builder);
@@ -397,8 +413,19 @@ public class DeclarationParser {
StatementParser.parseCodeBlock(builder);
}
else {
error(builder, JavaErrorMessages.message("expected.lbrace.or.semicolon"));
// todo: special treatment - like in fields (DeclarationParserTest.testMultiLineUnclosed())
final PsiBuilder.Marker error = builder.mark();
// heuristic: going to next line obviously means method signature is over, starting new method (actually, another one completion hack)
final CharSequence text = builder.getOriginalText();
Loop:
while (true) {
for (int i = builder.getCurrentOffset() - 1; i >= 0; i--) {
final char ch = text.charAt(i);
if (ch == '\n') break Loop;
else if (ch != ' ' && ch != '\t') break;
}
if (!expect(builder, APPEND_TO_METHOD_SET)) break;
}
error.error(JavaErrorMessages.message("expected.lbrace.or.semicolon"));
}
declaration.done(anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD);
@@ -480,7 +507,7 @@ public class DeclarationParser {
}
@Nullable
private static PsiBuilder.Marker parseParameter(final PsiBuilder builder, final boolean ellipsis) {
public static PsiBuilder.Marker parseParameter(final PsiBuilder builder, final boolean ellipsis) {
final PsiBuilder.Marker param = builder.mark();
final Pair<PsiBuilder.Marker, Boolean> modListInfo = parseModifierList(builder);
@@ -499,13 +526,14 @@ public class DeclarationParser {
if (expect(builder, JavaTokenType.IDENTIFIER)) {
eatBrackets(builder);
param.done(JavaElementType.PARAMETER);
return param;
}
else {
error(builder, JavaErrorMessages.message("expected.identifier"));
param.drop();
return type;
}
param.done(JavaElementType.PARAMETER);
return param;
}
@Nullable
@@ -519,8 +547,8 @@ public class DeclarationParser {
varType = JavaElementType.LOCAL_VARIABLE;
}
else {
LOG.error("Unexpected context: " + context);
declaration.drop();
assert false : "Unexpected context: " + context;
return null;
}
@@ -18,8 +18,6 @@ package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilderUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.TokenType;
import com.intellij.psi.impl.source.tree.ElementType;
@@ -29,13 +27,10 @@ import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.lang.java.parser.JavaParserUtil.areTypeAnnotationsSupported;
import static com.intellij.lang.java.parser.JavaParserUtil.error;
import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class ExpressionParser {
private static final Logger LOG = Logger.getInstance("#com.intellij.lang.java.parser.ExpressionParser");
private enum ExprType {
CONDITIONAL_OR, CONDITIONAL_AND, OR, XOR, AND, EQUALITY, RELATIONAL, SHIFT, ADDITIVE, MULTIPLICATIVE, UNARY, TYPE
}
@@ -168,7 +163,7 @@ public class ExpressionParser {
return typeInfo != null ? typeInfo.marker : null;
default:
LOG.error("Unexpected type: " + type);
assert false : "Unexpected type: " + type;
return null;
}
}
@@ -311,15 +306,12 @@ public class ExpressionParser {
private static PsiBuilder.Marker parsePrimary(final PsiBuilder builder, final boolean planB) {
PsiBuilder.Marker startMarker = builder.mark();
final Pair<PsiBuilder.Marker, IElementType> exprTypePair = parsePrimaryExpressionStart(builder);
if (exprTypePair == null) {
PsiBuilder.Marker expr = parsePrimaryExpressionStart(builder);
if (expr == null) {
startMarker.drop();
return null;
}
PsiBuilder.Marker expr = exprTypePair.first;
IElementType exprType = exprTypePair.second;
while (true) {
final IElementType tokenType = builder.getTokenType();
if (tokenType == JavaTokenType.DOT) {
@@ -327,7 +319,7 @@ public class ExpressionParser {
builder.advanceLexer();
final IElementType dotTokenType = builder.getTokenType();
if (dotTokenType == JavaTokenType.CLASS_KEYWORD && exprType == JavaElementType.REFERENCE_EXPRESSION) {
if (dotTokenType == JavaTokenType.CLASS_KEYWORD && exprType(expr) == JavaElementType.REFERENCE_EXPRESSION) {
if (planB) {
error(builder, JavaErrorMessages.message("expected.identifier"));
PsiBuilderUtil.drop(startMarker, dotPos);
@@ -345,15 +337,13 @@ public class ExpressionParser {
startMarker = copy;
expr = classObjAccess;
exprType = JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION;
}
else if (dotTokenType == JavaTokenType.NEW_KEYWORD) {
dotPos.drop();
expr = parseNew(builder, expr);
exprType = JavaElementType.NEW_EXPRESSION;
}
else if ((dotTokenType == JavaTokenType.THIS_KEYWORD || dotTokenType == JavaTokenType.SUPER_KEYWORD) &&
exprType == JavaElementType.REFERENCE_EXPRESSION) {
exprType(expr) == JavaElementType.REFERENCE_EXPRESSION) {
if (planB) {
dotPos.rollbackTo();
startMarker.drop();
@@ -377,15 +367,14 @@ public class ExpressionParser {
builder.advanceLexer();
startMarker = copy;
exprType = dotTokenType == JavaTokenType.THIS_KEYWORD ? JavaElementType.THIS_EXPRESSION : JavaElementType.SUPER_EXPRESSION;
expr = ref.precede();
expr.done(exprType);
expr.done(dotTokenType == JavaTokenType.THIS_KEYWORD ? JavaElementType.THIS_EXPRESSION : JavaElementType.SUPER_EXPRESSION);
}
else if (dotTokenType == JavaTokenType.SUPER_KEYWORD) {
dotPos.drop();
final PsiBuilder.Marker refExpr = expr.precede();
builder.advanceLexer();
refExpr.done(exprType = JavaElementType.REFERENCE_EXPRESSION);
refExpr.done(JavaElementType.REFERENCE_EXPRESSION);
expr = refExpr;
}
else {
@@ -399,13 +388,13 @@ public class ExpressionParser {
return refExpr;
}
refExpr.done(exprType = JavaElementType.REFERENCE_EXPRESSION);
refExpr.done(JavaElementType.REFERENCE_EXPRESSION);
expr = refExpr;
}
}
else if (tokenType == JavaTokenType.LPARENTH) {
if (exprType != JavaElementType.REFERENCE_EXPRESSION) {
if (exprType == JavaElementType.SUPER_EXPRESSION) {
if (exprType(expr) != JavaElementType.REFERENCE_EXPRESSION) {
if (exprType(expr) == JavaElementType.SUPER_EXPRESSION) {
if (planB) {
startMarker.drop();
return expr;
@@ -414,14 +403,14 @@ public class ExpressionParser {
final PsiBuilder.Marker copy = startMarker.precede();
startMarker.rollbackTo();
final Pair<PsiBuilder.Marker, IElementType> qualifier = parsePrimaryExpressionStart(builder);
final PsiBuilder.Marker qualifier = parsePrimaryExpressionStart(builder);
if (qualifier != null) {
final PsiBuilder.Marker refExpr = qualifier.first.precede();
final PsiBuilder.Marker refExpr = qualifier.precede();
if (builder.getTokenType() == JavaTokenType.DOT) {
builder.advanceLexer();
if (builder.getTokenType() == JavaTokenType.SUPER_KEYWORD) {
builder.advanceLexer();
refExpr.done(exprType = JavaElementType.REFERENCE_EXPRESSION);
refExpr.done(JavaElementType.REFERENCE_EXPRESSION);
expr = refExpr;
startMarker = copy;
continue;
@@ -440,7 +429,7 @@ public class ExpressionParser {
final PsiBuilder.Marker callExpr = expr.precede();
parseArgumentList(builder);
callExpr.done(exprType = JavaElementType.METHOD_CALL_EXPRESSION);
callExpr.done(JavaElementType.METHOD_CALL_EXPRESSION);
expr = callExpr;
}
else if (tokenType == JavaTokenType.LBRACKET) {
@@ -451,7 +440,7 @@ public class ExpressionParser {
builder.advanceLexer();
if (builder.getTokenType() == JavaTokenType.RBRACKET && exprType == JavaElementType.REFERENCE_EXPRESSION) {
if (builder.getTokenType() == JavaTokenType.RBRACKET && exprType(expr) == JavaElementType.REFERENCE_EXPRESSION) {
final PsiBuilder.Marker copy = startMarker.precede();
startMarker.rollbackTo();
@@ -463,7 +452,6 @@ public class ExpressionParser {
startMarker = copy;
expr = classObjAccess;
exprType = JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION;
}
else {
final PsiBuilder.Marker arrayAccess = expr.precede();
@@ -484,7 +472,7 @@ public class ExpressionParser {
}
builder.advanceLexer();
arrayAccess.done(exprType = JavaElementType.ARRAY_ACCESS_EXPRESSION);
arrayAccess.done(JavaElementType.ARRAY_ACCESS_EXPRESSION);
expr = arrayAccess;
}
}
@@ -496,14 +484,14 @@ public class ExpressionParser {
}
@Nullable
private static Pair<PsiBuilder.Marker, IElementType> parsePrimaryExpressionStart(final PsiBuilder builder) {
private static PsiBuilder.Marker parsePrimaryExpressionStart(final PsiBuilder builder) {
IElementType tokenType = builder.getTokenType();
if (LITERALS.contains(tokenType)) {
final PsiBuilder.Marker literal = builder.mark();
builder.advanceLexer();
literal.done(JavaElementType.LITERAL_EXPRESSION);
return Pair.create(literal, JavaElementType.LITERAL_EXPRESSION);
return literal;
}
if (tokenType == JavaTokenType.LPARENTH) {
final PsiBuilder.Marker parenth = builder.mark();
@@ -517,11 +505,10 @@ public class ExpressionParser {
JavaParserUtil.expectOrError(builder, JavaTokenType.RPARENTH, JavaErrorMessages.message("expected.rparen"));
parenth.done(JavaElementType.PARENTH_EXPRESSION);
return Pair.create(parenth, JavaElementType.PARENTH_EXPRESSION);
return parenth;
}
if (tokenType == JavaTokenType.LBRACE) {
final PsiBuilder.Marker arrayInit = parseArrayInitializer(builder);
return arrayInit != null ? Pair.create(arrayInit, JavaElementType.ARRAY_INITIALIZER_EXPRESSION) : null;
return parseArrayInitializer(builder);
}
PsiBuilder.Marker annotation = null;
@@ -546,7 +533,7 @@ public class ExpressionParser {
builder.advanceLexer();
refExpr.done(JavaElementType.REFERENCE_EXPRESSION);
beforeAnnotation.drop();
return Pair.create(refExpr, JavaElementType.REFERENCE_EXPRESSION);
return refExpr;
}
if (annotation != null) {
@@ -561,27 +548,21 @@ public class ExpressionParser {
final PsiBuilder.Marker expr = builder.mark();
builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST);
builder.advanceLexer();
final IElementType type = builder.getTokenType() != JavaTokenType.LPARENTH ?
JavaElementType.THIS_EXPRESSION : JavaElementType.REFERENCE_EXPRESSION;
expr.done(type);
return Pair.create(expr, type);
expr.done(builder.getTokenType() != JavaTokenType.LPARENTH ? JavaElementType.THIS_EXPRESSION : JavaElementType.REFERENCE_EXPRESSION);
return expr;
}
if (tokenType == JavaTokenType.SUPER_KEYWORD) {
final PsiBuilder.Marker expr = builder.mark();
builder.mark().done(JavaElementType.REFERENCE_PARAMETER_LIST);
builder.advanceLexer();
final IElementType type = builder.getTokenType() != JavaTokenType.LPARENTH ?
JavaElementType.SUPER_EXPRESSION : JavaElementType.REFERENCE_EXPRESSION;
expr.done(type);
return Pair.create(expr, type);
expr.done(builder.getTokenType() != JavaTokenType.LPARENTH ? JavaElementType.SUPER_EXPRESSION : JavaElementType.REFERENCE_EXPRESSION);
return expr;
}
if (tokenType == JavaTokenType.NEW_KEYWORD) {
final PsiBuilder.Marker newExpr = parseNew(builder, null);
return Pair.create(newExpr, JavaElementType.NEW_EXPRESSION);
return parseNew(builder, null);
}
if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(tokenType)) {
final PsiBuilder.Marker classObjAccess = parseClassObjectAccess(builder);
return classObjAccess != null ? Pair.create(classObjAccess, JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION) : null;
return parseClassObjectAccess(builder);
}
return null;
@@ -792,7 +773,7 @@ public class ExpressionParser {
}
private static void emptyExpression(final PsiBuilder builder) {
builder.mark().done(JavaElementType.EMPTY_EXPRESSION);
emptyElement(builder, JavaElementType.EMPTY_EXPRESSION);
}
@Nullable
@@ -0,0 +1,152 @@
/*
* Copyright 2000-2010 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.JavaElementType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.lang.PsiBuilderUtil.expect;
import static com.intellij.lang.java.parser.JavaParserUtil.semicolon;
public class FileParser {
private static final TokenSet IMPORT_LIST_STOPPER_SET = TokenSet.orSet(
ElementType.MODIFIER_BIT_SET,
TokenSet.create(JavaTokenType.CLASS_KEYWORD, JavaTokenType.INTERFACE_KEYWORD, JavaTokenType.ENUM_KEYWORD, JavaTokenType.AT));
private FileParser() { }
public static void parse(final PsiBuilder builder) {
parsePackageStatement(builder);
parseImportList(builder);
PsiBuilder.Marker invalidElements = null;
while (!builder.eof()) {
if (builder.getTokenType() == JavaTokenType.SEMICOLON) {
if (invalidElements != null) {
invalidElements.error(JavaErrorMessages.message("expected.class.or.interface"));
invalidElements = null;
}
builder.advanceLexer();
continue;
}
final PsiBuilder.Marker declaration = DeclarationParser.parse(builder, DeclarationParser.Context.FILE);
if (declaration != null) {
if (invalidElements != null) {
invalidElements.errorBefore(JavaErrorMessages.message("expected.class.or.interface"), declaration);
invalidElements = null;
}
continue;
}
if (invalidElements == null) {
invalidElements = builder.mark();
}
builder.advanceLexer();
}
if (invalidElements != null) {
invalidElements.error(JavaErrorMessages.message("expected.class.or.interface"));
}
}
@Nullable
private static PsiBuilder.Marker parsePackageStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
if (!expect(builder, JavaTokenType.PACKAGE_KEYWORD)) {
final PsiBuilder.Marker modList = builder.mark();
DeclarationParser.parseAnnotations(builder);
modList.done(JavaElementType.MODIFIER_LIST);
if (!expect(builder, JavaTokenType.PACKAGE_KEYWORD)) {
statement.rollbackTo();
return null;
}
}
final PsiBuilder.Marker ref = ReferenceParser.parseJavaCodeReference(builder, true, false, false);
if (ref == null) {
statement.rollbackTo();
return null;
}
semicolon(builder);
statement.done(JavaElementType.PACKAGE_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseImportList(final PsiBuilder builder) {
final PsiBuilder.Marker list = builder.mark();
if (builder.getTokenType() == JavaTokenType.IMPORT_KEYWORD) {
PsiBuilder.Marker invalidElements = null;
while (!builder.eof()) {
if (IMPORT_LIST_STOPPER_SET.contains(builder.getTokenType())) break;
final PsiBuilder.Marker statement = parseImportStatement(builder);
if (statement != null) {
if (invalidElements != null) {
invalidElements.errorBefore(JavaErrorMessages.message("unexpected.token"), statement);
invalidElements = null;
}
continue;
}
if (invalidElements == null) {
invalidElements = builder.mark();
}
builder.advanceLexer();
}
if (invalidElements != null) {
invalidElements.error(JavaErrorMessages.message("unexpected.token"));
}
}
list.done(JavaElementType.IMPORT_LIST);
return list;
}
@Nullable
private static PsiBuilder.Marker parseImportStatement(final PsiBuilder builder) {
if (builder.getTokenType() != JavaTokenType.IMPORT_KEYWORD) return null;
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final boolean isStatic = expect(builder, JavaTokenType.STATIC_KEYWORD);
final IElementType type = isStatic ? JavaElementType.IMPORT_STATIC_STATEMENT : JavaElementType.IMPORT_STATEMENT;
final boolean isOk = ReferenceParser.parseImportCodeReference(builder, isStatic);
if (isOk) {
semicolon(builder);
}
statement.done(type);
return statement;
}
}
@@ -34,12 +34,12 @@ public class JavaParser implements PsiParser {
@NotNull
public ASTNode parse(final IElementType rootType, final PsiBuilder builder) {
final PsiBuilder.Marker root = builder.mark();
setLanguageLevel(builder, myLanguageLevel);
// parse
final PsiBuilder.Marker root = builder.mark();
FileParser.parse(builder);
root.done(rootType);
return builder.getTreeBuilt();
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.*;
import com.intellij.openapi.util.Key;
import com.intellij.pom.java.LanguageLevel;
@@ -48,6 +49,11 @@ public class JavaParserUtil {
return level;
}
@Nullable
public static IElementType exprType(@Nullable final PsiBuilder.Marker marker) {
return marker != null ? ((LighterASTNode)marker).getTokenType() : null;
}
// used instead of PsiBuilder.error() as it drops all but first subsequent error messages
public static void error(final PsiBuilder builder, final String message) {
builder.mark().error(message);
@@ -78,6 +84,10 @@ public class JavaParserUtil {
before.precede().doneBefore(type, before);
}
public static void semicolon(final PsiBuilder builder) {
expectOrError(builder, JavaTokenType.SEMICOLON, JavaErrorMessages.message("expected.semicolon"));
}
public static PsiBuilder braceMatchingBuilder(final PsiBuilder builder) {
return new PsiBuilderAdapter(builder) {
private int braceCount = 1;
@@ -35,6 +35,7 @@ public class ReferenceParser {
public boolean isPrimitive = false;
public boolean isParameterized = false;
public boolean isArray = false;
public boolean hasErrors = false;
public PsiBuilder.Marker marker = null;
}
@@ -85,7 +86,7 @@ public class ReferenceParser {
typeInfo.isPrimitive = true;
}
else if (tokenType == JavaTokenType.IDENTIFIER) {
parseJavaCodeReference(builder, eatLastDot, true, annotationsSupported, typeInfo);
parseJavaCodeReference(builder, eatLastDot, true, annotationsSupported, false, false, typeInfo);
}
else if (wildcard && tokenType == JavaTokenType.QUEST) {
type.drop();
@@ -98,10 +99,10 @@ public class ReferenceParser {
}
while (true) {
type.done(JavaElementType.TYPE);
if (annotationsSupported) {
DeclarationParser.parseAnnotations(builder);
}
type.done(JavaElementType.TYPE);
if (!expect(builder, JavaTokenType.LBRACKET)) {
break;
@@ -137,12 +138,19 @@ public class ReferenceParser {
@Nullable
public static PsiBuilder.Marker parseJavaCodeReference(final PsiBuilder builder, final boolean eatLastDot,
final boolean parameterList, final boolean annotations) {
return parseJavaCodeReference(builder, eatLastDot, parameterList, annotations, new TypeInfo());
return parseJavaCodeReference(builder, eatLastDot, parameterList, annotations, false, false, new TypeInfo());
}
public static boolean parseImportCodeReference(final PsiBuilder builder, final boolean isStatic) {
final TypeInfo typeInfo = new TypeInfo();
parseJavaCodeReference(builder, true, false, false, true, isStatic, typeInfo);
return !typeInfo.hasErrors;
}
@Nullable
private static PsiBuilder.Marker parseJavaCodeReference(final PsiBuilder builder, final boolean eatLastDot,
final boolean parameterList, final boolean annotations,
final boolean isImport, final boolean isStaticImport,
final TypeInfo typeInfo) {
PsiBuilder.Marker refElement = builder.mark();
@@ -152,6 +160,10 @@ public class ReferenceParser {
if (!expect(builder, JavaTokenType.IDENTIFIER)) {
refElement.rollbackTo();
if (isImport) {
error(builder, JavaErrorMessages.message("expected.identifier"));
}
typeInfo.hasErrors = true;
return null;
}
@@ -173,6 +185,10 @@ public class ReferenceParser {
if (expect(builder, JavaTokenType.IDENTIFIER)) {
hasIdentifier = true;
}
else if (isImport && expect(builder, JavaTokenType.ASTERISK)) {
dotPos.drop();
return refElement;
}
else {
if (!eatLastDot) {
dotPos.rollbackTo();
@@ -182,23 +198,32 @@ public class ReferenceParser {
}
dotPos.drop();
final PsiBuilder.Marker prevElement = refElement;
refElement = refElement.precede();
if (!hasIdentifier) {
error(builder, JavaErrorMessages.message("expected.identifier"));
break;
typeInfo.hasErrors = true;
if (isImport) {
error(builder, JavaErrorMessages.message("import.statement.identifier.or.asterisk.expected."));
refElement.drop();
return prevElement;
}
else {
error(builder, JavaErrorMessages.message("expected.identifier"));
break;
}
}
if (parameterList) {
typeInfo.isParameterized = (builder.getTokenType() == JavaTokenType.LT);
parseReferenceParameterList(builder, true);
}
else {
else if (!isStaticImport || builder.getTokenType() == JavaTokenType.DOT) {
emptyElement(builder, JavaElementType.REFERENCE_PARAMETER_LIST);
}
}
refElement.done(JavaElementType.JAVA_CODE_REFERENCE);
refElement.done(isStaticImport ? JavaElementType.IMPORT_STATIC_REFERENCE : JavaElementType.JAVA_CODE_REFERENCE);
return refElement;
}
@@ -15,30 +15,704 @@
*/
package com.intellij.lang.java.parser;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.JavaElementType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ILazyParseableElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.intellij.lang.PsiBuilderUtil.*;
import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class StatementParser {
private static final boolean DEEP_PARSE_BLOCKS_IN_STATEMENTS = false;
private enum BraceMode {
TILL_FIRST, TILL_LAST
}
private static final TokenSet TRY_CLOSERS_SET = TokenSet.create(JavaTokenType.CATCH_KEYWORD, JavaTokenType.FINALLY_KEYWORD);
private StatementParser() { }
@Nullable
public static PsiBuilder.Marker parseCodeBlock(final PsiBuilder builder) {
if (builder.getTokenType() != JavaTokenType.LBRACE) return null;
else if (DEEP_PARSE_BLOCKS_IN_STATEMENTS) return parseCodeBlockDeep(builder, false);
final PsiBuilder.Marker codeBlock = builder.mark();
builder.advanceLexer();
// temp
if (builder.getTokenType() == JavaTokenType.RBRACE) {
int braceCount = 1;
while (true) {
final IElementType tokenType = builder.getTokenType();
if (tokenType == null) {
break;
}
if (tokenType == JavaTokenType.LBRACE) {
braceCount++;
}
else if (tokenType == JavaTokenType.RBRACE) {
braceCount--;
}
builder.advanceLexer();
codeBlock.done(JavaElementType.CODE_BLOCK);
return codeBlock;
if (braceCount == 0) {
break;
}
else if (braceCount == 1 && (tokenType == JavaTokenType.SEMICOLON || tokenType == JavaTokenType.RBRACE)) {
final PsiBuilder.Marker position = builder.mark();
final List<IElementType> list = new SmartList<IElementType>();
while (true) {
final IElementType type = builder.getTokenType();
if (ElementType.PRIMITIVE_TYPE_BIT_SET.contains(type) || ElementType.MODIFIER_BIT_SET.contains(type) ||
type == JavaTokenType.IDENTIFIER || type == JavaTokenType.LT || type == JavaTokenType.GT ||
type == JavaTokenType.GTGT || type == JavaTokenType.GTGTGT || type == JavaTokenType.COMMA ||
type == JavaTokenType.DOT || type == JavaTokenType.EXTENDS_KEYWORD || type == JavaTokenType.IMPLEMENTS_KEYWORD) {
list.add(type);
builder.advanceLexer();
} else {
break;
}
}
if (builder.getTokenType() == JavaTokenType.LPARENTH && list.size() >= 2) {
final IElementType last = list.get(list.size() - 1);
final IElementType prevLast = list.get(list.size() - 2);
if (last == JavaTokenType.IDENTIFIER &&
(prevLast == JavaTokenType.IDENTIFIER || ElementType.PRIMITIVE_TYPE_BIT_SET.contains(prevLast))) {
position.rollbackTo();
break;
}
}
position.drop();
}
}
// todo: implement
throw new UnsupportedOperationException(builder.toString());
codeBlock.collapse(JavaElementType.CODE_BLOCK);
return codeBlock;
}
@Nullable
public static PsiBuilder.Marker parseCodeBlockDeep(final PsiBuilder builder, final boolean parseUntilEof) {
if (builder.getTokenType() != JavaTokenType.LBRACE) return null;
final PsiBuilder.Marker codeBlock = builder.mark();
builder.advanceLexer();
parseStatements(builder, (parseUntilEof ? BraceMode.TILL_LAST : BraceMode.TILL_FIRST));
expectOrError(builder, JavaTokenType.RBRACE, JavaErrorMessages.message("expected.rbrace"));
codeBlock.done(JavaElementType.CODE_BLOCK);
return codeBlock;
}
private static void parseStatements(final PsiBuilder builder, final BraceMode braceMode) {
while (builder.getTokenType() != null) {
final PsiBuilder.Marker statement = parseStatement(builder);
if (statement != null) continue;
final IElementType tokenType = builder.getTokenType();
if (tokenType == JavaTokenType.RBRACE) {
if (braceMode == BraceMode.TILL_FIRST) {
return;
}
else if (braceMode == BraceMode.TILL_LAST) {
if (nextTokenType(builder) == null) {
return;
}
}
}
final PsiBuilder.Marker error = builder.mark();
builder.advanceLexer();
if (tokenType == JavaTokenType.ELSE_KEYWORD) {
error.error(JavaErrorMessages.message("else.without.if"));
}
else if (tokenType == JavaTokenType.CATCH_KEYWORD) {
error.error(JavaErrorMessages.message("catch.without.try"));
}
else if (tokenType == JavaTokenType.FINALLY_KEYWORD) {
error.error(JavaErrorMessages.message("finally.without.try"));
}
else {
error.error(JavaErrorMessages.message("unexpected.token"));
}
}
}
@Nullable
private static PsiBuilder.Marker parseStatement(final PsiBuilder builder) {
final IElementType tokenType = builder.getTokenType();
// todo: custom parsers (?)
if (tokenType == JavaTokenType.IF_KEYWORD) {
return parseIfStatement(builder);
}
else if (tokenType == JavaTokenType.WHILE_KEYWORD) {
return parseWhileStatement(builder);
}
else if (tokenType == JavaTokenType.FOR_KEYWORD) {
return parseForStatement(builder);
}
else if (tokenType == JavaTokenType.DO_KEYWORD) {
return parseDoWhileStatement(builder);
}
else if (tokenType == JavaTokenType.SWITCH_KEYWORD) {
return parseSwitchStatement(builder);
}
else if (tokenType == JavaTokenType.CASE_KEYWORD || tokenType == JavaTokenType.DEFAULT_KEYWORD) {
return parseSwitchLabelStatement(builder);
}
else if (tokenType == JavaTokenType.BREAK_KEYWORD) {
return parseBreakStatement(builder);
}
else if (tokenType == JavaTokenType.CONTINUE_KEYWORD) {
return parseContinueStatement(builder);
}
else if (tokenType == JavaTokenType.RETURN_KEYWORD) {
return parseReturnStatement(builder);
}
else if (tokenType == JavaTokenType.THROW_KEYWORD) {
return parseThrowStatement(builder);
}
else if (tokenType == JavaTokenType.SYNCHRONIZED_KEYWORD) {
return parseSynchronizedStatement(builder);
}
else if (tokenType == JavaTokenType.TRY_KEYWORD) {
return parseTryStatement(builder);
}
else if (tokenType == JavaTokenType.ASSERT_KEYWORD) {
return parseAssertStatement(builder);
}
else if (tokenType == JavaTokenType.LBRACE) {
return parseBlockStatement(builder);
}
else if (tokenType instanceof ILazyParseableElementType) {
builder.advanceLexer();
return null;
}
else if (tokenType == JavaTokenType.SEMICOLON) {
final PsiBuilder.Marker empty = builder.mark();
builder.advanceLexer();
empty.done(JavaElementType.EMPTY_STATEMENT);
return empty;
}
else if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.AT) {
final PsiBuilder.Marker refPos = builder.mark();
DeclarationParser.parseAnnotations(builder);
skipQualifiedName(builder);
final IElementType suspectedLT = builder.getTokenType();
refPos.rollbackTo();
if (suspectedLT == JavaTokenType.LT) {
final PsiBuilder.Marker declStatement = builder.mark();
final PsiBuilder.Marker decl = DeclarationParser.parse(builder, DeclarationParser.Context.CODE_BLOCK);
if (decl == null) {
ReferenceParser.parseType(builder, false, false);
error(builder, JavaErrorMessages.message("expected.identifier"));
}
declStatement.done(JavaElementType.DECLARATION_STATEMENT);
return declStatement;
}
}
final PsiBuilder.Marker pos = builder.mark();
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr != null) {
int count = 1;
final PsiBuilder.Marker list = expr.precede();
final PsiBuilder.Marker statement = list.precede();
while (builder.getTokenType() == JavaTokenType.COMMA) {
final PsiBuilder.Marker commaPos = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker expr1 = ExpressionParser.parse(builder);
if (expr1 == null) {
commaPos.rollbackTo();
break;
}
commaPos.drop();
count++;
}
if (count > 1) {
pos.drop();
list.done(JavaElementType.EXPRESSION_LIST);
semicolon(builder);
statement.done(JavaElementType.EXPRESSION_LIST_STATEMENT);
return statement;
}
if (exprType(expr) != JavaElementType.REFERENCE_EXPRESSION) {
drop(list, pos);
semicolon(builder);
statement.done(JavaElementType.EXPRESSION_STATEMENT);
return statement;
}
pos.rollbackTo();
}
else {
pos.drop();
}
final PsiBuilder.Marker decl = DeclarationParser.parse(builder, DeclarationParser.Context.CODE_BLOCK);
if (decl != null) {
final PsiBuilder.Marker statement = decl.precede();
statement.done(JavaElementType.DECLARATION_STATEMENT);
return statement;
}
if (lookAhead(builder, JavaTokenType.IDENTIFIER, JavaTokenType.COLON)) {
final PsiBuilder.Marker statement = builder.mark();
advance(builder, 2);
parseStatement(builder);
statement.done(JavaElementType.LABELED_STATEMENT);
return statement;
}
if (expr != null) {
final PsiBuilder.Marker statement = builder.mark();
ExpressionParser.parse(builder);
semicolon(builder);
statement.done(JavaElementType.EXPRESSION_STATEMENT);
return statement;
}
return null;
}
private static void skipQualifiedName(final PsiBuilder builder) {
if (!expect(builder, JavaTokenType.IDENTIFIER)) return;
while (lookAhead(builder, JavaTokenType.DOT, JavaTokenType.IDENTIFIER)) {
advance(builder, 2);
}
}
@NotNull
private static PsiBuilder.Marker parseIfStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!parseExpressionInParenth(builder)) {
statement.done(JavaElementType.IF_STATEMENT);
return statement;
}
final PsiBuilder.Marker thenStatement = parseStatement(builder);
if (thenStatement == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
statement.done(JavaElementType.IF_STATEMENT);
return statement;
}
if (!expect(builder, JavaTokenType.ELSE_KEYWORD)) {
statement.done(JavaElementType.IF_STATEMENT);
return statement;
}
final PsiBuilder.Marker elseStatement = parseStatement(builder);
if (elseStatement == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
}
statement.done(JavaElementType.IF_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseWhileStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!parseExpressionInParenth(builder)) {
statement.done(JavaElementType.WHILE_STATEMENT);
return statement;
}
final PsiBuilder.Marker bodyStatement = parseStatement(builder);
if (bodyStatement == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
}
statement.done(JavaElementType.WHILE_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseForStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!expect(builder, JavaTokenType.LPARENTH)) {
error(builder, JavaErrorMessages.message("expected.lparen"));
statement.done(JavaElementType.FOR_STATEMENT);
return statement;
}
final PsiBuilder.Marker afterParenth = builder.mark();
final PsiBuilder.Marker param = DeclarationParser.parseParameter(builder, false);
if (param == null || builder.getTokenType() != JavaTokenType.COLON) {
afterParenth.rollbackTo();
return parseForLoopFromInitialization(builder, statement);
}
else {
afterParenth.drop();
return parseForEachFromColon(builder, statement);
}
}
@NotNull
private static PsiBuilder.Marker parseForLoopFromInitialization(final PsiBuilder builder, final PsiBuilder.Marker statement) {
final PsiBuilder.Marker init = parseStatement(builder);
if (init == null){
error(builder, JavaErrorMessages.message("expected.statement"));
if (!expect(builder, JavaTokenType.RPARENTH)) {
statement.done(JavaElementType.FOR_STATEMENT);
return statement;
}
}
else {
ExpressionParser.parse(builder);
if (!expect(builder, JavaTokenType.SEMICOLON)) {
error(builder, JavaErrorMessages.message("expected.semicolon"));
if (!expect(builder, JavaTokenType.RPARENTH)) {
statement.done(JavaElementType.FOR_STATEMENT);
return statement;
}
}
else {
parseExpressionOrExpressionList(builder);
if (!expect(builder, JavaTokenType.RPARENTH)) {
error(builder, JavaErrorMessages.message("expected.rparen"));
statement.done(JavaElementType.FOR_STATEMENT);
return statement;
}
}
}
final PsiBuilder.Marker bodyStatement = parseStatement(builder);
if (bodyStatement == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
}
statement.done(JavaElementType.FOR_STATEMENT);
return statement;
}
private static void parseExpressionOrExpressionList(final PsiBuilder builder) {
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null) return;
final PsiBuilder.Marker expressionStatement;
if (builder.getTokenType() != JavaTokenType.COMMA) {
expressionStatement = expr.precede();
expressionStatement.done(JavaElementType.EXPRESSION_STATEMENT);
}
else {
final PsiBuilder.Marker expressionList = expr.precede();
expressionStatement = expressionList.precede();
do {
builder.advanceLexer();
final PsiBuilder.Marker nextExpression = ExpressionParser.parse(builder);
if (nextExpression == null) {
error(builder, JavaErrorMessages.message("expected.expression"));
}
}
while (builder.getTokenType() == JavaTokenType.COMMA);
expressionList.done(JavaElementType.EXPRESSION_LIST);
expressionStatement.done(JavaElementType.EXPRESSION_LIST_STATEMENT);
}
}
@NotNull
private static PsiBuilder.Marker parseForEachFromColon(PsiBuilder builder, PsiBuilder.Marker statement) {
builder.advanceLexer();
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null) {
error(builder, JavaErrorMessages.message("expected.expression"));
}
if (expect(builder, JavaTokenType.RPARENTH)) {
final PsiBuilder.Marker bodyStatement = parseStatement(builder);
if (bodyStatement == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
}
}
else {
error(builder, JavaErrorMessages.message("expected.rparen"));
}
statement.done(JavaElementType.FOREACH_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseDoWhileStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker body = parseStatement(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
if (!expect(builder, JavaTokenType.WHILE_KEYWORD)) {
error(builder, JavaErrorMessages.message("expected.while"));
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
if (parseExpressionInParenth(builder)) {
semicolon(builder);
}
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseSwitchStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!parseExpressionInParenth(builder)) {
statement.done(JavaElementType.SWITCH_STATEMENT);
return statement;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
statement.done(JavaElementType.SWITCH_STATEMENT);
return statement;
}
@Nullable
private static PsiBuilder.Marker parseSwitchLabelStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
final boolean isCase = builder.getTokenType() == JavaTokenType.CASE_KEYWORD;
builder.advanceLexer();
if (isCase) {
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null) {
statement.rollbackTo();
return null;
}
}
expectOrError(builder, JavaTokenType.COLON, JavaErrorMessages.message("expected.colon"));
statement.done(JavaElementType.SWITCH_LABEL_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseBreakStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
expect(builder, JavaTokenType.IDENTIFIER);
semicolon(builder);
statement.done(JavaElementType.BREAK_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseContinueStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
expect(builder, JavaTokenType.IDENTIFIER);
semicolon(builder);
statement.done(JavaElementType.CONTINUE_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseReturnStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
ExpressionParser.parse(builder);
semicolon(builder);
statement.done(JavaElementType.RETURN_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseThrowStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null) {
error(builder, JavaErrorMessages.message("expected.expression"));
statement.done(JavaElementType.THROW_STATEMENT);
return statement;
}
semicolon(builder);
statement.done(JavaElementType.THROW_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseSynchronizedStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!parseExpressionInParenth(builder)) {
statement.done(JavaElementType.SYNCHRONIZED_STATEMENT);
return statement;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
statement.done(JavaElementType.SYNCHRONIZED_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseTryStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker tryBlock = parseCodeBlock(builder);
if (tryBlock == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
statement.done(JavaElementType.TRY_STATEMENT);
return statement;
}
if (!TRY_CLOSERS_SET.contains(builder.getTokenType())) {
error(builder, JavaErrorMessages.message("expected.catch.or.finally"));
statement.done(JavaElementType.TRY_STATEMENT);
return statement;
}
while (builder.getTokenType() == JavaTokenType.CATCH_KEYWORD) {
if (!parseCatchBlock(builder)) break;
}
if (expect(builder, JavaTokenType.FINALLY_KEYWORD)) {
final PsiBuilder.Marker finallyBlock = parseCodeBlock(builder);
if (finallyBlock == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
}
statement.done(JavaElementType.TRY_STATEMENT);
return statement;
}
private static boolean parseCatchBlock(final PsiBuilder builder) {
final PsiBuilder.Marker section = builder.mark();
builder.advanceLexer();
if (!expect(builder, JavaTokenType.LPARENTH)) {
error(builder, JavaErrorMessages.message("expected.lparen"));
section.done(JavaElementType.CATCH_SECTION);
return false;
}
final PsiBuilder.Marker param = DeclarationParser.parseParameter(builder, false);
if (param == null) {
error(builder, JavaErrorMessages.message("expected.parameter"));
}
if (!expect(builder, JavaTokenType.RPARENTH)) {
error(builder, JavaErrorMessages.message("expected.rparen"));
section.done(JavaElementType.CATCH_SECTION);
return false;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
section.done(JavaElementType.CATCH_SECTION);
return false;
}
section.done(JavaElementType.CATCH_SECTION);
return true;
}
@NotNull
private static PsiBuilder.Marker parseAssertStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null) {
error(builder, JavaErrorMessages.message("expected.boolean.expression"));
statement.done(JavaElementType.ASSERT_STATEMENT);
return statement;
}
if (expect(builder, JavaTokenType.COLON)) {
final PsiBuilder.Marker expr2 = ExpressionParser.parse(builder);
if (expr2 == null) {
error(builder, JavaErrorMessages.message("expected.expression"));
statement.done(JavaElementType.ASSERT_STATEMENT);
return statement;
}
}
semicolon(builder);
statement.done(JavaElementType.ASSERT_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseBlockStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
parseCodeBlock(builder);
statement.done(JavaElementType.BLOCK_STATEMENT);
return statement;
}
private static boolean parseExpressionInParenth(final PsiBuilder builder) {
if (!expect(builder, JavaTokenType.LPARENTH)) {
error(builder, JavaErrorMessages.message("expected.lparen"));
return false;
}
final PsiBuilder.Marker beforeExpr = builder.mark();
final PsiBuilder.Marker expr = ExpressionParser.parse(builder);
if (expr == null || builder.getTokenType() == JavaTokenType.SEMICOLON) {
beforeExpr.rollbackTo();
error(builder, JavaErrorMessages.message("expected.expression"));
if (builder.getTokenType() != JavaTokenType.RPARENTH) {
return false;
}
}
else {
beforeExpr.drop();
if (builder.getTokenType() != JavaTokenType.RPARENTH) {
error(builder, JavaErrorMessages.message("expected.rparen"));
return false;
}
}
builder.advanceLexer();
return true;
}
}
@@ -20,9 +20,9 @@
package com.intellij.psi.impl.java.stubs;
import com.intellij.psi.impl.source.JavaFileElementType;
import com.intellij.psi.tree.IStubFileElementType;
public class JavaStubElementTypes {
public static final JavaFileElementType FILE = new JavaFileElementType();
public static final JavaClassElementType CLASS = new JavaClassElementType("CLASS");
public static final JavaClassElementType ANONYMOUS_CLASS = new JavaClassElementType("ANONYMOUS_CLASS");
public static final JavaClassElementType ENUM_CONSTANT_INITIALIZER = new JavaClassElementType("ENUM_CONSTANT_INITIALIZER");
@@ -47,4 +47,5 @@ public class JavaStubElementTypes {
public static final JavaImportListElementType IMPORT_LIST = new JavaImportListElementType();
public static final JavaImportStatementElementType IMPORT_STATEMENT = new JavaImportStatementElementType("IMPORT_STATEMENT");
public static final JavaImportStatementElementType IMPORT_STATIC_STATEMENT = new JavaImportStatementElementType("IMPORT_STATIC_STATEMENT");
public static final IStubFileElementType JAVA_FILE = new JavaFileElementType();
}
@@ -26,15 +26,14 @@ import com.intellij.psi.impl.java.stubs.impl.PsiTypeParameterListStubImpl;
import com.intellij.psi.impl.source.tree.java.PsiTypeParameterListImpl;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.util.io.PersistentStringEnumerator;
import com.intellij.psi.stubs.StubOutputStream;
import java.io.IOException;
public class JavaTypeParameterListElementType extends JavaStubElementType<PsiTypeParameterListStub, PsiTypeParameterList> {
public JavaTypeParameterListElementType() {
super("TYPE_PARAMETER_LIST");
super("TYPE_PARAMETER_LIST", true);
}
public PsiTypeParameterList createPsi(final PsiTypeParameterListStub stub) {
@@ -60,7 +60,7 @@ public class PsiJavaFileStubImpl extends PsiFileStubImpl<PsiJavaFile> implements
}
public IStubFileElementType getType() {
return JavaStubElementTypes.FILE;
return JavaStubElementTypes.JAVA_FILE;
}
@SuppressWarnings({"HardCodedStringLiteral"})
@@ -23,16 +23,19 @@ import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
/**
* @author peter
*/
public class MethodTextOccurrenceProcessor extends RequestResultProcessor {
public final class MethodTextOccurrenceProcessor extends RequestResultProcessor {
private static final PsiReferenceService ourReferenceService = PsiReferenceService.getService();
private final PsiMethod[] myMethods;
private final PsiClass myContainingClass;
private final boolean myStrictSignatureSearch;
public MethodTextOccurrenceProcessor(@NotNull final PsiClass aClass, final boolean strictSignatureSearch, final PsiMethod... methods) {
super(strictSignatureSearch, Arrays.asList(methods));
myMethods = methods;
myContainingClass = aClass;
myStrictSignatureSearch = strictSignatureSearch;
@@ -26,6 +26,7 @@ import com.intellij.psi.FileViewProvider;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiPackageStatement;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.IncorrectOperationException;
import com.intellij.testFramework.LightVirtualFile;
@@ -33,7 +34,7 @@ import org.jetbrains.annotations.NotNull;
public class PsiJavaFileImpl extends PsiJavaFileBaseImpl {
public PsiJavaFileImpl(FileViewProvider file) {
super(Constants.JAVA_FILE, Constants.JAVA_FILE, file);
super(JavaStubElementTypes.JAVA_FILE, JavaStubElementTypes.JAVA_FILE, file);
}
public String toString(){
@@ -905,13 +905,14 @@ public class DeclarationParsing extends Parsing {
if (tokenType != JavaTokenType.SEMICOLON && tokenType != JavaTokenType.LBRACE){
CompositeElement invalidElementsGroup = Factory.createErrorElement(JavaErrorMessages.message("expected.lbrace.or.semicolon"));
method.rawAddChildren(invalidElementsGroup);
final CharSequence buf = lexer.getBufferSequence();
Loop:
while(true){
tokenType = lexer.getTokenType();
// Heuristic. Going to next line obviously means method signature is over, starting new method.
// Necessary for correct CompleteStatementTest operation.
final CharSequence buf = lexer.getBufferSequence();
int start = lexer.getTokenStart();
for (int i = start - 1; i >= 0; i--) {
if (buf.charAt(i) == '\n') break Loop;
@@ -252,7 +252,7 @@ public class StatementParsing extends Parsing {
else if (tokenType == JavaTokenType.CATCH_KEYWORD){
error = JavaErrorMessages.message("catch.without.try");
}
else if (tokenType == JavaTokenType.FINAL_KEYWORD){
else if (tokenType == JavaTokenType.FINALLY_KEYWORD){
error = JavaErrorMessages.message("finally.without.try");
}
else{
@@ -21,6 +21,7 @@ package com.intellij.psi.impl.source.tree;
import com.intellij.lang.ASTFactory;
import com.intellij.psi.PlainTextTokenTypes;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.source.*;
import com.intellij.psi.impl.source.javadoc.*;
import com.intellij.psi.impl.source.tree.java.*;
@@ -34,7 +35,7 @@ public class JavaASTFactory extends ASTFactory implements Constants {
@Override
public LazyParseableElement createLazy(ILazyParseableElementType type, CharSequence text) {
if (type == JAVA_FILE) {
if (type == JavaStubElementTypes.JAVA_FILE) {
return new JavaFileElement(text);
}
else if (type == PlainTextTokenTypes.PLAIN_TEXT_FILE) {
@@ -289,6 +290,10 @@ public class JavaASTFactory extends ASTFactory implements Constants {
else if (type == METHOD_RECEIVER) {
return new PsiMethodReceiverImpl();
}
else if (type == CODE_BLOCK) {
// deep code block parsing
return new PsiCodeBlockImpl(null);
}
return new CompositePsiElement(type){};
}
@@ -24,21 +24,17 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.source.JavaFileElementType;
import com.intellij.psi.impl.source.parsing.JavaParsingContext;
import com.intellij.psi.impl.source.parsing.Parsing;
import com.intellij.psi.impl.source.tree.java.PsiCodeBlockImpl;
import com.intellij.psi.text.BlockSupport;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.IErrorCounterReparseableElementType;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.ILazyParseableElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.tree.*;
import com.intellij.psi.tree.java.IJavaElementType;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.CharTable;
public interface JavaElementType {
IFileElementType JAVA_FILE = JavaStubElementTypes.FILE;
IElementType CLASS = JavaStubElementTypes.CLASS;
IElementType ANONYMOUS_CLASS = JavaStubElementTypes.ANONYMOUS_CLASS;
@@ -91,7 +87,7 @@ public interface JavaElementType {
IElementType ARRAY_INITIALIZER_EXPRESSION = new IJavaElementType("ARRAY_INITIALIZER_EXPRESSION");
IElementType INSTANCE_OF_EXPRESSION = new IJavaElementType("INSTANCE_OF_EXPRESSION");
IElementType CLASS_OBJECT_ACCESS_EXPRESSION = new IJavaElementType("CLASS_OBJECT_ACCESS_EXPRESSION");
IElementType EMPTY_EXPRESSION = new IJavaElementType("EMPTY_EXPRESSION");
IElementType EMPTY_EXPRESSION = new IJavaElementType("EMPTY_EXPRESSION", true);
IElementType EXPRESSION_LIST = new IJavaElementType("EXPRESSION_LIST", true);
@@ -123,6 +119,8 @@ public interface JavaElementType {
IElementType ANNOTATION_PARAMETER_LIST = new IJavaElementType("ANNOTATION_PARAMETER_LIST", true);
IElementType METHOD_RECEIVER = new IJavaElementType("METHOD_RECEIVER");
IElementType INSTANT_CODE_BLOCK = new IJavaElementType("CODE_BLOCK");
ILazyParseableElementType CODE_BLOCK = new IErrorCounterReparseableElementType("CODE_BLOCK", StdLanguages.JAVA) {
@Override
public ASTNode createNode(CharSequence text) {
@@ -16,10 +16,9 @@
package com.intellij.psi.impl.source.tree.injected;
import com.intellij.lang.injection.ConcatenationAwareInjector;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lang.injection.MultiHostInjector;
import com.intellij.lang.injection.MultiHostRegistrar;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.extensions.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
@@ -30,27 +29,22 @@ import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiParameterizedCachedValue;
import com.intellij.psi.util.*;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author cdr
*/
public class JavaConcatenationInjectorManager implements ProjectComponent, ModificationTracker {
public class JavaConcatenationInjectorManager implements ModificationTracker {
public static final ExtensionPointName<ConcatenationAwareInjector> CONCATENATION_INJECTOR_EP_NAME = ExtensionPointName.create("com.intellij.concatenationAwareInjector");
private final AtomicReference<MultiHostInjector> myRegisteredConcatenationAdapter = new AtomicReference<MultiHostInjector>();
private final InjectedLanguageManager myInjectedLanguageManager;
private volatile long myModificationCounter;
private static final ConcatenationPsiCachedValueProvider CONCATENATION_PSI_CACHED_VALUE_PROVIDER = new ConcatenationPsiCachedValueProvider();
public JavaConcatenationInjectorManager(Project project, InjectedLanguageManager injectedLanguageManager, PsiManagerEx psiManagerEx) {
myInjectedLanguageManager = injectedLanguageManager;
public JavaConcatenationInjectorManager(Project project, PsiManagerEx psiManagerEx) {
final ExtensionPoint<ConcatenationAwareInjector> concatPoint = Extensions.getArea(project).getExtensionPoint(CONCATENATION_INJECTOR_EP_NAME);
concatPoint.addExtensionPointListener(new ExtensionPointListener<ConcatenationAwareInjector>() {
public void extensionAdded(ConcatenationAwareInjector injector, @Nullable PluginDescriptor pluginDescriptor) {
@@ -68,30 +62,8 @@ public class JavaConcatenationInjectorManager implements ProjectComponent, Modif
});
}
public void projectOpened() {
}
public void projectClosed() {
}
@NonNls
@NotNull
public String getComponentName() {
return "JavaConcatenationInjectorManager";
}
public void initComponent() {
}
public void disposeComponent() {
}
public static JavaConcatenationInjectorManager getInstance(final Project project) {
return project.getComponent(JavaConcatenationInjectorManager.class);
return ServiceManager.getService(project, JavaConcatenationInjectorManager.class);
}
public long getModificationCount() {
@@ -151,10 +123,16 @@ public class JavaConcatenationInjectorManager implements ProjectComponent, Modif
}
private static final Key<ParameterizedCachedValue<MultiHostRegistrarImpl, PsiElement>> INJECTED_PSI_IN_CONCATENATION = Key.create("INJECTED_PSI_IN_CONCATENATION");
private final Concatenation2InjectorAdapter myConcatenation2InjectorAdapter = new Concatenation2InjectorAdapter();
private class Concatenation2InjectorAdapter implements MultiHostInjector {
public static class Concatenation2InjectorAdapter implements MultiHostInjector {
private final JavaConcatenationInjectorManager myManager;
public Concatenation2InjectorAdapter(Project project) {
myManager = getInstance(project);
}
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
if (myConcatenationInjectors.isEmpty()) return;
if (myManager.myConcatenationInjectors.isEmpty()) return;
ParameterizedCachedValue<MultiHostRegistrarImpl, PsiElement> cachedValue = context.getUserData(INJECTED_PSI_IN_CONCATENATION);
MultiHostRegistrarImpl result;
@@ -203,16 +181,5 @@ public class JavaConcatenationInjectorManager implements ProjectComponent, Modif
private void concatenationInjectorsChanged() {
myModificationCounter++;
if (myConcatenationInjectors.isEmpty()) {
MultiHostInjector prev = myRegisteredConcatenationAdapter.getAndSet(null);
if (prev != null) {
myInjectedLanguageManager.unregisterMultiHostInjector(prev);
}
}
else {
if (myRegisteredConcatenationAdapter.compareAndSet(null, myConcatenation2InjectorAdapter)) {
myInjectedLanguageManager.registerMultiHostInjector(myConcatenation2InjectorAdapter);
}
}
}
}
@@ -18,6 +18,7 @@ package com.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.tree.ChildRole;
@@ -33,7 +34,7 @@ public class JavaFileElement extends FileElement implements Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.JavaFileElement");
public JavaFileElement(CharSequence text) {
super(JAVA_FILE, text);
super(JavaStubElementTypes.JAVA_FILE, text);
}
public TreeElement addInternal(TreeElement first, ASTNode last, ASTNode anchor, Boolean before) {
@@ -27,6 +27,7 @@ import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.psi.impl.source.jsp.JspContextManager;
import com.intellij.psi.impl.source.jsp.jspJava.JspCodeBlock;
import com.intellij.psi.impl.source.tree.*;
import com.intellij.psi.jsp.BaseJspFile;
import com.intellij.psi.jsp.JspElementType;
import com.intellij.psi.jsp.JspFile;
import com.intellij.psi.jsp.JspSpiUtil;
@@ -289,10 +290,10 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca
}
final Set<PsiFile> allIncluded = new THashSet<PsiFile>(10);
final JspFile rootContext = contextManager.getRootContextFile(jspFile);
final BaseJspFile rootContext = contextManager.getRootContextFile(jspFile);
allIncluded.add(rootContext);
JspSpiUtil.visitAllIncludedFilesRecursively(rootContext, new Processor<JspFile>() {
public boolean process(final JspFile file) {
JspSpiUtil.visitAllIncludedFilesRecursively(rootContext, new Processor<BaseJspFile>() {
public boolean process(final BaseJspFile file) {
allIncluded.add(file);
return true;
}
@@ -1,74 +0,0 @@
/*
* Copyright 2000-2009 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
import org.jetbrains.annotations.Nullable;
public class MoveClassesHandler extends MoveClassesOrPackagesHandlerBase {
public boolean canMove(final PsiElement[] elements, @Nullable final PsiElement targetContainer) {
for(PsiElement element: elements) {
PsiFile parentFile;
if (element instanceof PsiJavaFile) {
final PsiClass[] classes = ((PsiJavaFile)element).getClasses();
if (classes.length == 0) return false;
for (PsiClass aClass : classes) {
if (aClass instanceof JspClass) return false;
}
parentFile = (PsiFile)element;
} else {
if (element instanceof JspClass) return false;
if (!(element instanceof PsiClass)) return false;
if (!(element.getParent() instanceof PsiFile)) return false;
parentFile = (PsiFile)element.getParent();
}
if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(parentFile)) return false;
}
return super.canMove(elements, targetContainer);
}
public boolean isValidTarget(final PsiElement psiElement) {
return psiElement instanceof PsiClass ||
MovePackagesHandler.isPackageOrDirectory(psiElement);
}
public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference,
final Editor editor) {
if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(element.getContainingFile())) return false;
if (isReferenceInAnonymousClass(reference)) return false;
if (element instanceof PsiClass && !(element instanceof PsiAnonymousClass) && element.getParent() instanceof PsiFile) {
MoveClassesOrPackagesImpl.doMove(project, new PsiElement[]{element},
LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext), null);
return true;
}
return false;
}
public static boolean isReferenceInAnonymousClass(@Nullable final PsiReference reference) {
if (reference instanceof PsiJavaCodeReferenceElement &&
((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiAnonymousClass) {
return true;
}
return false;
}
}
@@ -15,28 +15,127 @@
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.MoveHandlerDelegate;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.JavaDirectoryService;
import com.intellij.openapi.project.Project;
import com.intellij.refactoring.util.RadioUpDownListener;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
public abstract class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
protected static boolean isPackageOrDirectory(final PsiElement element) {
public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate {
private static final Logger LOG = Logger.getInstance("#" + MoveClassesOrPackagesHandlerBase.class.getName());
public static boolean isPackageOrDirectory(final PsiElement element) {
if (element instanceof PsiPackage) return true;
return element instanceof PsiDirectory && JavaDirectoryService.getInstance().getPackage((PsiDirectory)element) != null;
}
public static boolean isReferenceInAnonymousClass(@Nullable final PsiReference reference) {
if (reference instanceof PsiJavaCodeReferenceElement &&
((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiAnonymousClass) {
return true;
}
return false;
}
@Override
public boolean canMove(PsiElement[] elements, @Nullable PsiElement targetContainer) {
for (PsiElement element : elements) {
if (!isPackageOrDirectory(element)) {
PsiFile parentFile;
if (element instanceof PsiJavaFile) {
final PsiClass[] classes = ((PsiJavaFile)element).getClasses();
if (classes.length == 0) return false;
for (PsiClass aClass : classes) {
if (aClass instanceof JspClass) return false;
}
parentFile = (PsiFile)element;
}
else {
if (element instanceof JspClass) return false;
if (!(element instanceof PsiClass)) return false;
if (!(element.getParent() instanceof PsiFile)) return false;
parentFile = (PsiFile)element.getParent();
}
if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(parentFile)) return false;
}
}
return super.canMove(elements, targetContainer);
}
@Override
public boolean isValidTarget(PsiElement psiElement, PsiElement[] sources) {
if (isPackageOrDirectory(psiElement)) return true;
boolean hasPackageOrDir = false;
for (PsiElement source : sources) {
hasPackageOrDir |= isPackageOrDirectory(source);
}
return !hasPackageOrDir && psiElement instanceof PsiClass;
}
public PsiElement[] adjustForMove(final Project project, final PsiElement[] sourceElements, final PsiElement targetElement) {
return MoveClassesOrPackagesImpl.adjustForMove(project,sourceElements, targetElement);
}
public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) {
if (canMoveOrRearrangePackages(elements) ) {
final PsiDirectory[] directories = new PsiDirectory[elements.length];
System.arraycopy(elements, 0, directories, 0, directories.length);
SelectMoveOrRearrangePackageDialog dialog = new SelectMoveOrRearrangePackageDialog(project, directories, targetContainer == null);
dialog.show();
if (!dialog.isOK()) return;
if (dialog.isPackageRearrageSelected()) {
MoveClassesOrPackagesImpl.doRearrangePackage(project, directories);
return;
}
if (dialog.isMoveDirectory()) {
if (targetContainer instanceof PsiDirectory) {
final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance();
final MoveDirectoryWithClassesProcessor processor =
new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer,
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE,
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback);
processor.run();
}
else {
final MoveClassesOrPackagesToNewDirectoryDialog dlg =
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], false, callback) {
@Override
protected void performRefactoring(Project project,
final PsiDirectory targetDirectory,
PsiPackage aPackage,
boolean searchInComments,
boolean searchForTextOccurences) {
final MoveDirectoryWithClassesProcessor processor =
new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences,
true, callback);
processor.run();
}
};
dlg.show();
}
return;
}
}
if (tryDirectoryMove ( project, elements, targetContainer, callback)) {
return;
}
@@ -55,4 +154,144 @@ public abstract class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelega
}
return false;
}
private static boolean canMoveOrRearrangePackages(PsiElement[] elements) {
if (elements.length == 0) return false;
final Project project = elements[0].getProject();
if (ProjectRootManager.getInstance(project).getContentSourceRoots().length == 1) {
return false;
}
for (PsiElement element : elements) {
if (!(element instanceof PsiDirectory)) return false;
final PsiDirectory directory = ((PsiDirectory)element);
if (RefactoringUtil.isSourceRoot(directory)) {
return false;
}
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
if (aPackage == null) return false;
if ("".equals(aPackage.getQualifiedName())) return false;
final VirtualFile sourceRootForFile = ProjectRootManager.getInstance(element.getProject()).getFileIndex()
.getSourceRootForFile(directory.getVirtualFile());
if (sourceRootForFile == null) return false;
}
return true;
}
private static class SelectMoveOrRearrangePackageDialog extends DialogWrapper {
private JRadioButton myRbMovePackage;
private JRadioButton myRbRearrangePackage;
private JRadioButton myRbMoveDirectory;
private final PsiDirectory[] myDirectories;
private final boolean myRearrangePackagesEnabled;
public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories) {
this(project, directories, true);
}
public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories, boolean rearrangePackagesEnabled) {
super(project, true);
myDirectories = directories;
myRearrangePackagesEnabled = rearrangePackagesEnabled;
setTitle(RefactoringBundle.message("select.refactoring.title"));
init();
}
protected JComponent createNorthPanel() {
return new JLabel(RefactoringBundle.message("what.would.you.like.to.do"));
}
public JComponent getPreferredFocusedComponent() {
return myRbMovePackage;
}
protected String getDimensionServiceKey() {
return "#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog";
}
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new BorderLayout());
final HashSet<String> packages = new HashSet<String>();
for (PsiDirectory directory : myDirectories) {
packages.add(JavaDirectoryService.getInstance().getPackage(directory).getQualifiedName());
}
final String moveDescription;
LOG.assertTrue(myDirectories.length > 0);
LOG.assertTrue(packages.size() > 0);
if (packages.size() > 1) {
moveDescription = RefactoringBundle.message("move.packages.to.another.package", packages.size());
}
else {
final String qName = packages.iterator().next();
moveDescription = RefactoringBundle.message("move.package.to.another.package", qName);
}
myRbMovePackage = new JRadioButton();
myRbMovePackage.setText(moveDescription);
myRbMovePackage.setSelected(true);
final String rearrangeDescription;
if (myDirectories.length > 1) {
rearrangeDescription = RefactoringBundle.message("move.directories.to.another.source.root", myDirectories.length);
}
else {
rearrangeDescription = RefactoringBundle.message("move.directory.to.another.source.root", myDirectories[0].getVirtualFile().getPresentableUrl());
}
myRbRearrangePackage = new JRadioButton();
myRbRearrangePackage.setText(rearrangeDescription);
myRbRearrangePackage.setVisible(myRearrangePackagesEnabled);
final String moveDirectoryDescription;
if (myDirectories.length > 1) {
moveDirectoryDescription = "Move everything from " + myDirectories.length + " directories to another directory";
}
else {
moveDirectoryDescription = "Move everything from " + myDirectories[0].getVirtualFile().getPresentableUrl() + " to another directory";
}
myRbMoveDirectory = new JRadioButton();
myRbMoveDirectory.setMnemonic('d');
myRbMoveDirectory.setText(moveDirectoryDescription);
ButtonGroup gr = new ButtonGroup();
gr.add(myRbMovePackage);
gr.add(myRbRearrangePackage);
gr.add(myRbMoveDirectory);
new RadioUpDownListener(myRbMovePackage, myRbRearrangePackage, myRbMoveDirectory);
Box box = Box.createVerticalBox();
box.add(Box.createVerticalStrut(5));
box.add(myRbMovePackage);
box.add(myRbRearrangePackage);
box.add(myRbMoveDirectory);
panel.add(box, BorderLayout.CENTER);
return panel;
}
public boolean isPackageRearrageSelected() {
return myRbRearrangePackage.isSelected();
}
public boolean isMoveDirectory() {
return myRbMoveDirectory.isSelected();
}
}
public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference,
final Editor editor) {
if (isPackageOrDirectory(element)) return false;
if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(element.getContainingFile())) return false;
if (isReferenceInAnonymousClass(reference)) return false;
if (element instanceof PsiClass && !(element instanceof PsiAnonymousClass) && element.getParent() instanceof PsiFile) {
MoveClassesOrPackagesImpl.doMove(project, new PsiElement[]{element},
LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext), null);
return true;
}
return false;
}
}
@@ -37,29 +37,30 @@ public class MoveJavaClassHandler implements MoveClassHandler {
final PsiPackage newPackage = JavaDirectoryService.getInstance().getPackage(moveDestination);
PsiClass newClass = null;
if (file instanceof PsiJavaFile && ((PsiJavaFile)file).getClasses().length > 1) {
correctSelfReferences(aClass, newPackage);
final PsiClass created = JavaDirectoryService.getInstance().createClass(moveDestination, aClass.getName());
if (aClass.getDocComment() == null) {
final PsiDocComment createdDocComment = created.getDocComment();
if (createdDocComment != null) {
aClass.addAfter(createdDocComment, null);
if (file instanceof PsiJavaFile) {
if (!moveDestination.equals(file.getContainingDirectory()) &&
moveDestination.findFile(file.getName()) != null) {
// moving second of two classes which were in the same file to a different directory (IDEADEV-3089)
correctSelfReferences(aClass, newPackage);
final PsiFile newFile = moveDestination.findFile(file.getName());
LOG.assertTrue(newFile != null);
newClass = (PsiClass)newFile.add(aClass);
correctOldClassReferences(newClass, aClass);
aClass.delete();
}
else if (((PsiJavaFile)file).getClasses().length > 1) {
correctSelfReferences(aClass, newPackage);
final PsiClass created = JavaDirectoryService.getInstance().createClass(moveDestination, aClass.getName());
if (aClass.getDocComment() == null) {
final PsiDocComment createdDocComment = created.getDocComment();
if (createdDocComment != null) {
aClass.addAfter(createdDocComment, null);
}
}
newClass = (PsiClass)created.replace(aClass);
correctOldClassReferences(newClass, aClass);
aClass.delete();
}
newClass = (PsiClass)created.replace(aClass);
correctOldClassReferences(newClass, aClass);
aClass.delete();
}
else if (file instanceof PsiJavaFile &&
!moveDestination.equals(file.getContainingDirectory()) &&
moveDestination.findFile(file.getName()) != null) {
// moving second of two classes which were in the same file to a different directory (IDEADEV-3089)
correctSelfReferences(aClass, newPackage);
final PsiFile newFile = moveDestination.findFile(file.getName());
LOG.assertTrue(newFile != null);
newClass = (PsiClass)newFile.add(aClass);
correctOldClassReferences(newClass, aClass);
aClass.delete();
}
return newClass;
}
@@ -1,220 +0,0 @@
/*
* Copyright 2000-2009 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.util.RadioUpDownListener;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.containers.HashSet;
import javax.swing.*;
import java.awt.*;
public class MovePackagesHandler extends MoveClassesOrPackagesHandlerBase {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MovePackagesHandler");
public boolean canMove(final PsiElement[] elements, final PsiElement targetContainer) {
for(PsiElement element: elements) {
if (!isPackageOrDirectory(element)) return false;
}
return super.canMove(elements, targetContainer);
}
public boolean isValidTarget(final PsiElement psiElement) {
return isPackageOrDirectory(psiElement);
}
public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) {
if (canMoveOrRearrangePackages(elements) ) {
final PsiDirectory[] directories = new PsiDirectory[elements.length];
System.arraycopy(elements, 0, directories, 0, directories.length);
SelectMoveOrRearrangePackageDialog dialog = new SelectMoveOrRearrangePackageDialog(project, directories, targetContainer == null);
dialog.show();
if (!dialog.isOK()) return;
if (dialog.isPackageRearrageSelected()) {
MoveClassesOrPackagesImpl.doRearrangePackage(project, directories);
return;
}
if (dialog.isMoveDirectory()) {
if (targetContainer instanceof PsiDirectory) {
final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance();
final MoveDirectoryWithClassesProcessor processor =
new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer,
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE,
refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback);
processor.run();
}
else {
final MoveClassesOrPackagesToNewDirectoryDialog dlg =
new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], false, callback) {
@Override
protected void performRefactoring(Project project,
final PsiDirectory targetDirectory,
PsiPackage aPackage,
boolean searchInComments,
boolean searchForTextOccurences) {
final MoveDirectoryWithClassesProcessor processor =
new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences,
true, callback);
processor.run();
}
};
dlg.show();
}
return;
}
}
super.doMove(project, elements, targetContainer, callback);
}
private static boolean canMoveOrRearrangePackages(PsiElement[] elements) {
if (elements.length == 0) return false;
final Project project = elements[0].getProject();
if (ProjectRootManager.getInstance(project).getContentSourceRoots().length == 1) {
return false;
}
for (PsiElement element : elements) {
if (!(element instanceof PsiDirectory)) return false;
final PsiDirectory directory = ((PsiDirectory)element);
if (RefactoringUtil.isSourceRoot(directory)) {
return false;
}
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
if (aPackage == null) return false;
if ("".equals(aPackage.getQualifiedName())) return false;
final VirtualFile sourceRootForFile = ProjectRootManager.getInstance(element.getProject()).getFileIndex()
.getSourceRootForFile(directory.getVirtualFile());
if (sourceRootForFile == null) return false;
}
return true;
}
private static class SelectMoveOrRearrangePackageDialog extends DialogWrapper {
private JRadioButton myRbMovePackage;
private JRadioButton myRbRearrangePackage;
private JRadioButton myRbMoveDirectory;
private final PsiDirectory[] myDirectories;
private final boolean myRearrangePackagesEnabled;
public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories) {
this(project, directories, true);
}
public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories, boolean rearrangePackagesEnabled) {
super(project, true);
myDirectories = directories;
myRearrangePackagesEnabled = rearrangePackagesEnabled;
setTitle(RefactoringBundle.message("select.refactoring.title"));
init();
}
protected JComponent createNorthPanel() {
return new JLabel(RefactoringBundle.message("what.would.you.like.to.do"));
}
public JComponent getPreferredFocusedComponent() {
return myRbMovePackage;
}
protected String getDimensionServiceKey() {
return "#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog";
}
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new BorderLayout());
final HashSet<String> packages = new HashSet<String>();
for (PsiDirectory directory : myDirectories) {
packages.add(JavaDirectoryService.getInstance().getPackage(directory).getQualifiedName());
}
final String moveDescription;
LOG.assertTrue(myDirectories.length > 0);
LOG.assertTrue(packages.size() > 0);
if (packages.size() > 1) {
moveDescription = RefactoringBundle.message("move.packages.to.another.package", packages.size());
}
else {
final String qName = packages.iterator().next();
moveDescription = RefactoringBundle.message("move.package.to.another.package", qName);
}
myRbMovePackage = new JRadioButton();
myRbMovePackage.setText(moveDescription);
myRbMovePackage.setSelected(true);
final String rearrangeDescription;
if (myDirectories.length > 1) {
rearrangeDescription = RefactoringBundle.message("move.directories.to.another.source.root", myDirectories.length);
}
else {
rearrangeDescription = RefactoringBundle.message("move.directory.to.another.source.root", myDirectories[0].getVirtualFile().getPresentableUrl());
}
myRbRearrangePackage = new JRadioButton();
myRbRearrangePackage.setText(rearrangeDescription);
myRbRearrangePackage.setVisible(myRearrangePackagesEnabled);
final String moveDirectoryDescription;
if (myDirectories.length > 1) {
moveDirectoryDescription = "Move everything from " + myDirectories.length + " directories to another directory";
}
else {
moveDirectoryDescription = "Move everything from " + myDirectories[0].getVirtualFile().getPresentableUrl() + " to another directory";
}
myRbMoveDirectory = new JRadioButton();
myRbMoveDirectory.setMnemonic('d');
myRbMoveDirectory.setText(moveDirectoryDescription);
ButtonGroup gr = new ButtonGroup();
gr.add(myRbMovePackage);
gr.add(myRbRearrangePackage);
gr.add(myRbMoveDirectory);
new RadioUpDownListener(myRbMovePackage, myRbRearrangePackage, myRbMoveDirectory);
Box box = Box.createVerticalBox();
box.add(Box.createVerticalStrut(5));
box.add(myRbMovePackage);
box.add(myRbRearrangePackage);
box.add(myRbMoveDirectory);
panel.add(box, BorderLayout.CENTER);
return panel;
}
public boolean isPackageRearrageSelected() {
return myRbRearrangePackage.isSelected();
}
public boolean isMoveDirectory() {
return myRbMoveDirectory.isSelected();
}
}
}
@@ -15,20 +15,20 @@
*/
package com.intellij.refactoring.move.moveInner;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
import com.intellij.refactoring.move.MoveHandlerDelegate;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesHandler;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.move.MoveHandlerDelegate;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import org.jetbrains.annotations.Nullable;
public class MoveInnerToUpperHandler extends MoveHandlerDelegate {
@@ -51,7 +51,7 @@ public class MoveInnerToUpperHandler extends MoveHandlerDelegate {
public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference,
final Editor editor) {
if (isNonStaticInnerClass(element) && !MoveClassesHandler.isReferenceInAnonymousClass(reference)) {
if (isNonStaticInnerClass(element) && !MoveClassesOrPackagesHandlerBase.isReferenceInAnonymousClass(reference)) {
PsiClass aClass = (PsiClass) element;
FeatureUsageTracker.getInstance().triggerFeatureUsed("refactoring.move.moveInner");
final PsiClass containingClass = aClass.getContainingClass();
@@ -15,10 +15,11 @@
*/
package com.intellij.refactoring.move.moveInner;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiModifier;
@@ -26,10 +27,9 @@ import com.intellij.psi.PsiReference;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.MoveCallback;
import com.intellij.refactoring.move.MoveHandlerDelegate;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesHandler;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase;
import com.intellij.refactoring.move.moveMembers.MoveMembersHandler;
import com.intellij.refactoring.util.RadioUpDownListener;
import com.intellij.featureStatistics.FeatureUsageTracker;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -62,7 +62,7 @@ public class MoveInnerToUpperOrMembersHandler extends MoveHandlerDelegate {
public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference,
final Editor editor) {
if (isStaticInnerClass(element) && !MoveClassesHandler.isReferenceInAnonymousClass(reference)) {
if (isStaticInnerClass(element) && !MoveClassesOrPackagesHandlerBase.isReferenceInAnonymousClass(reference)) {
FeatureUsageTracker.getInstance().triggerFeatureUsed("refactoring.move.moveInner");
PsiClass aClass = (PsiClass) element;
SelectInnerOrMembersRefactoringDialog dialog = new SelectInnerOrMembersRefactoringDialog(aClass, project);
@@ -35,7 +35,7 @@ public class MoveInstanceMethodHandlerDelegate extends MoveHandlerDelegate {
return super.canMove(elements, targetContainer);
}
public boolean isValidTarget(final PsiElement psiElement) {
public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) {
return psiElement instanceof PsiClass && !(psiElement instanceof PsiAnonymousClass);
}
@@ -32,7 +32,7 @@ public class MoveMembersHandler extends MoveHandlerDelegate {
return super.canMove(elements, targetContainer);
}
public boolean isValidTarget(final PsiElement psiElement) {
public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) {
return psiElement instanceof PsiClass && !(psiElement instanceof PsiAnonymousClass);
}
+3
View File
@@ -15,6 +15,9 @@
<orderEntry type="module" module-name="platform-api" />
<orderEntry type="library" name="Velocity" level="project" />
<orderEntry type="module" module-name="java-i18n" />
<orderEntry type="module" module-name="compiler-impl" />
<orderEntry type="library" name="asm" level="project" />
<orderEntry type="module" module-name="notNull" />
</component>
</module>
@@ -1,7 +1,7 @@
public class Xxx {
void foo() {
super.<caret>
super<caret>
}
}
@@ -0,0 +1,11 @@
import org.jetbrains.annotations.NotNull;
public enum EnumConstructor {
Value("label");
private final String label;
EnumConstructor(@NotNull String label) {
this.label = label;
}
}
@@ -0,0 +1,9 @@
import org.jetbrains.annotations.NotNull;
public class MultipleReturns {
@NotNull public Object test(int i) {
if (i == 0) return null;
if (i == 1) return null;
return null;
}
}
@@ -0,0 +1,7 @@
import org.jetbrains.annotations.NotNull;
public class SimpleReturn {
@NotNull public Object test() {
return null;
}
}
@@ -0,0 +1,22 @@
PsiJavaFile:AnnoDeclaration.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:Annotation
PsiModifierList:public
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiJavaToken:AT('@')
PsiKeyword:interface('interface')
PsiWhiteSpace(' ')
PsiIdentifier:Annotation('Annotation')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,35 @@
PsiJavaFile:AnnoDefault.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiAnnotationMethod:foo
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:Class
PsiJavaCodeReferenceElement:Class
PsiIdentifier:Class('Class')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:foo('foo')
PsiWhiteSpace(' ')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiKeyword:default('default')
PsiWhiteSpace(' ')
PsiClassObjectAccessExpression:String.class
PsiTypeElement:String
PsiJavaCodeReferenceElement:String
PsiIdentifier:String('String')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiKeyword:class('class')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,44 @@
PsiJavaFile:AnnoInner.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:Inner
PsiModifierList:
<empty list>
PsiJavaToken:AT('@')
PsiKeyword:interface('interface')
PsiWhiteSpace(' ')
PsiIdentifier:Inner('Inner')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiAnnotationMethod:bar
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:double
PsiKeyword:double('double')
PsiWhiteSpace(' ')
PsiIdentifier:bar('bar')
PsiWhiteSpace(' ')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiKeyword:default('default')
PsiWhiteSpace(' ')
PsiLiteralExpression:0.0
PsiJavaToken:DOUBLE_LITERAL('0.0')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,47 @@
PsiJavaFile:AnnoNested.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:Inner
PsiModifierList:
<empty list>
PsiJavaToken:AT('@')
PsiKeyword:interface('interface')
PsiWhiteSpace(' ')
PsiIdentifier:Inner('Inner')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiAnnotationMethod:bar
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:String
PsiJavaCodeReferenceElement:String
PsiIdentifier:String('String')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:bar('bar')
PsiWhiteSpace(' ')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiKeyword:default('default')
PsiWhiteSpace(' ')
PsiLiteralExpression:"<unspecified>"
PsiJavaToken:STRING_LITERAL('"<unspecified>"')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,64 @@
PsiJavaFile:AnnoOtherMembers.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiField:field
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiAnnotationMethod:m
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:m('m')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n ')
PsiClass:C
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n ')
PsiClass:I
PsiModifierList:
<empty list>
PsiKeyword:interface('interface')
PsiWhiteSpace(' ')
PsiIdentifier:I('I')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,21 @@
PsiJavaFile:AnnoSimple.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiAnnotationMethod:foo
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:foo('foo')
PsiWhiteSpace(' ')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,14 @@
PsiJavaFile:ClassInit.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClassInitializer
PsiModifierList:
<empty list>
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiComment(C_STYLE_COMMENT)('/*comment*/')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,25 @@
PsiJavaFile:CompletionHack2.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiAnnotationMethod:foo
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:String
PsiJavaCodeReferenceElement:String
PsiIdentifier:String('String')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:foo('foo')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiErrorElement:'{' or ';' expected
PsiIdentifier:def('def')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,16 @@
PsiJavaFile:EmptyBody2.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiModifierList:@Null
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Null
PsiIdentifier:Null('Null')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiErrorElement:Identifier or type expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,45 @@
PsiJavaFile:EnumBody6.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiEnumConstant:RED
PsiModifierList:
<empty list>
PsiIdentifier:RED('RED')
PsiExpressionList
<empty list>
PsiJavaToken:COMMA(',')
PsiWhiteSpace(' ')
PsiEnumConstant:GREEN
PsiModifierList:
<empty list>
PsiIdentifier:GREEN('GREEN')
PsiExpressionList
<empty list>
PsiJavaToken:COMMA(',')
PsiWhiteSpace(' ')
PsiEnumConstant:BLUE
PsiModifierList:
<empty list>
PsiIdentifier:BLUE('BLUE')
PsiExpressionList
<empty list>
PsiErrorElement:',' or ';' expected
<empty list>
PsiWhiteSpace('\n ')
PsiMethod:OurEnum
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiIdentifier:OurEnum('OurEnum')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,143 @@
PsiJavaFile:EnumSmartTypeCompletion.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:TimeTravel
PsiModifierList:@Preliminary(A.B
#) public
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Preliminary
PsiIdentifier:Preliminary('Preliminary')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
PsiJavaToken:LPARENTH('(')
PsiNameValuePair
PsiReferenceExpression:A.B
PsiReferenceExpression:A
PsiReferenceParameterList
<empty list>
PsiIdentifier:A('A')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:B('B')
PsiErrorElement:',' or ')' expected
<empty list>
PsiWhiteSpace('\n')
PsiElement(BAD_CHARACTER)('#')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:TimeTravel('TimeTravel')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n ')
PsiClass:TimeTravel
PsiModifierList:@Preliminary(a=A.B
#) public
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Preliminary
PsiIdentifier:Preliminary('Preliminary')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
PsiJavaToken:LPARENTH('(')
PsiNameValuePair
PsiIdentifier:a('a')
PsiJavaToken:EQ('=')
PsiReferenceExpression:A.B
PsiReferenceExpression:A
PsiReferenceParameterList
<empty list>
PsiIdentifier:A('A')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:B('B')
PsiErrorElement:',' or ')' expected
<empty list>
PsiWhiteSpace('\n')
PsiElement(BAD_CHARACTER)('#')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:TimeTravel('TimeTravel')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n ')
PsiClass:TimeTravel
PsiModifierList:@Preliminary(a=A.B
#, b=c) public
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Preliminary
PsiIdentifier:Preliminary('Preliminary')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
PsiJavaToken:LPARENTH('(')
PsiNameValuePair
PsiIdentifier:a('a')
PsiJavaToken:EQ('=')
PsiReferenceExpression:A.B
PsiReferenceExpression:A
PsiReferenceParameterList
<empty list>
PsiIdentifier:A('A')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:B('B')
PsiErrorElement:',' or ')' expected
<empty list>
PsiWhiteSpace('\n')
PsiElement(BAD_CHARACTER)('#')
PsiJavaToken:COMMA(',')
PsiWhiteSpace(' ')
PsiNameValuePair
PsiIdentifier:b('b')
PsiJavaToken:EQ('=')
PsiReferenceExpression:c
PsiReferenceParameterList
<empty list>
PsiIdentifier:c('c')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:TimeTravel('TimeTravel')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,51 @@
PsiJavaFile:EnumWithInitializedConstants.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiEnumConstant:A
PsiModifierList:
<empty list>
PsiIdentifier:A('A')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiAnonymousClass (PsiEnumConstantInitializerImpl)):
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiJavaToken:COMMA(',')
PsiWhiteSpace('\n ')
PsiEnumConstant:B
PsiModifierList:
<empty list>
PsiIdentifier:B('B')
PsiExpressionList
<empty list>
PsiWhiteSpace(' ')
PsiAnonymousClass (PsiEnumConstantInitializerImpl)):
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:method
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:method('method')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,17 @@
PsiJavaFile:EnumWithoutConstants.java
PsiJavaToken:LBRACE('{')
PsiErrorElement:';' expected
<empty list>
PsiWhiteSpace(' ')
PsiModifierList:private
PsiKeyword:private('private')
PsiWhiteSpace(' ')
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiErrorElement:Identifier expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,22 @@
PsiJavaFile:ExtraSemicolon.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:C
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,51 @@
PsiJavaFile:IncompleteAnnotation.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:Foo
PsiModifierList:public
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:Foo('Foo')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:testSomething
PsiModifierList:public
PsiKeyword:public('public')
PsiTypeParameterList
<empty list>
PsiWhiteSpace(' ')
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:testSomething('testSomething')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiModifierList:@Null
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Null
PsiIdentifier:Null('Null')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiErrorElement:Identifier or type expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -18,7 +18,6 @@ PsiJavaFile:MethodNormal0.java
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,20 @@
PsiJavaFile:NoType.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiErrorElement:Unexpected token
PsiKeyword:new('new')
PsiWhiteSpace(' ')
PsiMethod:X
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiIdentifier:X('X')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,45 @@
PsiJavaFile:ParameterAnnotation.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:foo
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:foo('foo')
PsiWhiteSpace(' ')
PsiParameterList:(@Annotation(value=77) int param)
PsiJavaToken:LPARENTH('(')
PsiParameter:param
PsiModifierList:@Annotation(value=77)
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Annotation
PsiIdentifier:Annotation('Annotation')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
PsiJavaToken:LPARENTH('(')
PsiNameValuePair
PsiIdentifier:value('value')
PsiJavaToken:EQ('=')
PsiLiteralExpression:77
PsiJavaToken:INTEGER_LITERAL('77')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:param('param')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,44 @@
PsiJavaFile:ParameterizedClass.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:A
PsiModifierList:public
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiWhiteSpace(' ')
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiWhiteSpace(' ')
PsiElement(EXTENDS_BOUND_LIST)
PsiKeyword:extends('extends')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:java.util.List
PsiJavaCodeReferenceElement:java.util
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:util('util')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:List('List')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,40 @@
PsiJavaFile:ParameterizedMethod.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:bar
PsiModifierList:@Nullable
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Nullable
PsiIdentifier:Nullable('Nullable')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:bar('bar')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,56 @@
PsiJavaFile:Pines.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiWhiteSpace(' ')
PsiElement(EXTENDS_BOUND_LIST)
PsiKeyword:extends('extends')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:List<String>
PsiIdentifier:List('List')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:String
PsiJavaCodeReferenceElement:String
PsiIdentifier:String('String')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiReferenceList
PsiKeyword:extends('extends')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:List<List<Integer>>
PsiIdentifier:List('List')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:List<Integer>
PsiJavaCodeReferenceElement:List<Integer>
PsiIdentifier:List('List')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiJavaToken:GT('>')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,44 @@
PsiJavaFile:Semicolons.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiMethod:f
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:f('f')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiMethod:g
PsiModifierList:
<empty list>
PsiTypeParameterList
<empty list>
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:g('g')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,327 @@
PsiJavaFile:TypeAnno.java
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiClass:C
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:D
PsiIdentifier:D('D')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:T('T')
PsiWhiteSpace(' ')
PsiElement(EXTENDS_BOUND_LIST)
PsiKeyword:extends('extends')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:@F Object
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:Object('Object')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiReferenceList
PsiKeyword:extends('extends')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:@F Object
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:Object('Object')
PsiReferenceParameterList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiMethod:method
PsiModifierList:@F
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiTypeParameterList
<empty list>
PsiWhiteSpace(' ')
PsiTypeElement:int @F[]
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiJavaToken:LBRACKET('[')
PsiJavaToken:RBRACKET(']')
PsiWhiteSpace(' ')
PsiIdentifier:method('method')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiElement(METHOD_RECEIVER)
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiReferenceList
PsiKeyword:throws('throws')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:@F Exception
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:Exception('Exception')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiExpressionStatement
PsiAssignmentExpression:a = this instanceof @F C
PsiReferenceExpression:a
PsiReferenceParameterList
<empty list>
PsiIdentifier:a('a')
PsiWhiteSpace(' ')
PsiJavaToken:EQ('=')
PsiWhiteSpace(' ')
PsiInstanceofExpression:this instanceof @F C
PsiThisExpression:this
PsiReferenceParameterList
<empty list>
PsiKeyword:this('this')
PsiWhiteSpace(' ')
PsiKeyword:instanceof('instanceof')
PsiWhiteSpace(' ')
PsiTypeElement:@F C
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:C
PsiIdentifier:C('C')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiDeclarationStatement
PsiLocalVariable:c
PsiModifierList:
<empty list>
PsiTypeElement:C<@F @G C>
PsiJavaCodeReferenceElement:C<@F @G C>
PsiIdentifier:C('C')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:@F @G C
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:G
PsiIdentifier:G('G')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:C
PsiIdentifier:C('C')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiIdentifier:c('c')
PsiWhiteSpace(' ')
PsiJavaToken:EQ('=')
PsiWhiteSpace(' ')
PsiNewExpression:new @Q C<@F C>()
PsiKeyword:new('new')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:@Q C<@F C>
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Q
PsiIdentifier:Q('Q')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:@F C
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:C
PsiIdentifier:C('C')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiExpressionStatement
PsiAssignmentExpression:c = (@F Object)c
PsiReferenceExpression:c
PsiReferenceParameterList
<empty list>
PsiIdentifier:c('c')
PsiWhiteSpace(' ')
PsiJavaToken:EQ('=')
PsiWhiteSpace(' ')
PsiTypeCastExpression:(@F Object)c
PsiJavaToken:LPARENTH('(')
PsiTypeElement:@F Object
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:Object
PsiIdentifier:Object('Object')
PsiReferenceParameterList
<empty list>
PsiJavaToken:RPARENTH(')')
PsiReferenceExpression:c
PsiReferenceParameterList
<empty list>
PsiIdentifier:c('c')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiDeclarationStatement
PsiLocalVariable:c
PsiModifierList:
<empty list>
PsiTypeElement:Class
PsiJavaCodeReferenceElement:Class
PsiIdentifier:Class('Class')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:c('c')
PsiWhiteSpace(' ')
PsiJavaToken:EQ('=')
PsiWhiteSpace(' ')
PsiClassObjectAccessExpression:@TA String.class
PsiTypeElement:@TA String
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:TA
PsiIdentifier:TA('TA')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:String
PsiIdentifier:String('String')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiKeyword:class('class')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiExpressionStatement
PsiPostfixExpression:@F C.field++
PsiReferenceExpression:@F C.field
PsiReferenceExpression:@F C
PsiReferenceParameterList
<empty list>
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:F
PsiIdentifier:F('F')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:field('field')
PsiJavaToken:PLUSPLUS('++')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,31 @@
PsiJavaFile:AnnotatedPackage.java
PsiPackageStatement:a.b.c
PsiModifierList:@Anno
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Anno
PsiIdentifier:Anno('Anno')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiKeyword:package('package')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:a.b.c
PsiJavaCodeReferenceElement:a.b
PsiJavaCodeReferenceElement:a
PsiIdentifier:a('a')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:b('b')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:c('c')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiImportList
<empty list>
@@ -0,0 +1,29 @@
PsiJavaFile:BindBefore0.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiField:field
PsiComment(END_OF_LINE_COMMENT)('// comment')
PsiWhiteSpace('\n ')
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,29 @@
PsiJavaFile:BindBefore1.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('// comment')
PsiWhiteSpace('\n\n ')
PsiField:field
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,29 @@
PsiJavaFile:BindBefore2.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiComment(END_OF_LINE_COMMENT)('// comment')
PsiWhiteSpace('\n ')
PsiField:field
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,28 @@
PsiJavaFile:BindBefore3.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiJavaToken:LBRACE('{')
PsiComment(END_OF_LINE_COMMENT)('// comment')
PsiWhiteSpace('\n ')
PsiField:field
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,33 @@
PsiJavaFile:BindBefore4.java
PsiImportList
<empty list>
PsiClass:A
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:A('A')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiField:field
PsiComment(END_OF_LINE_COMMENT)('// comment 1')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('// comment 2')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('// comment 3')
PsiWhiteSpace('\n ')
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:field('field')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,3 @@
PsiJavaFile:EmptyFile.java
PsiImportList
<empty list>
@@ -0,0 +1,54 @@
PsiJavaFile:FileWithClass.java
PsiPackageStatement:a
PsiKeyword:package('package')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:a
PsiIdentifier:a('a')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiImportList
PsiImportStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:b
PsiIdentifier:b('b')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiClass:C
PsiModifierList:public
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n')
PsiClass:D
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:D('D')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,17 @@
PsiJavaFile:Import0.java
PsiImportList
PsiImportStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:java.util
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:util('util')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiJavaToken:ASTERISK('*')
PsiJavaToken:SEMICOLON(';')
@@ -0,0 +1,20 @@
PsiJavaFile:Import1.java
PsiImportList
PsiImportStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:java.util.Arrays
PsiJavaCodeReferenceElement:java.util
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:util('util')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:Arrays('Arrays')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
@@ -0,0 +1,21 @@
PsiJavaFile:Package.java
PsiPackageStatement:a.b.c
PsiKeyword:package('package')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:a.b.c
PsiJavaCodeReferenceElement:a.b
PsiJavaCodeReferenceElement:a
PsiIdentifier:a('a')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:b('b')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:c('c')
PsiReferenceParameterList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiImportList
<empty list>
@@ -0,0 +1,24 @@
PsiJavaFile:StaticImport0.java
PsiImportList
PsiImportStaticStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiKeyword:static('static')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:java.util.Arrays
PsiJavaCodeReferenceElement:java.util
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:util('util')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:Arrays('Arrays')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiJavaToken:ASTERISK('*')
PsiJavaToken:SEMICOLON(';')
@@ -0,0 +1,25 @@
PsiJavaFile:StaticImport1.java
PsiImportList
PsiImportStaticStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiKeyword:static('static')
PsiWhiteSpace(' ')
PsiImportStaticReferenceElement:java.util.Arrays.sort
PsiJavaCodeReferenceElement:java.util.Arrays
PsiJavaCodeReferenceElement:java.util
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:util('util')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:Arrays('Arrays')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:sort('sort')
PsiJavaToken:SEMICOLON(';')
@@ -0,0 +1,6 @@
PsiJavaFile:UnclosedImport0.java
PsiImportList
PsiImportStatement
PsiKeyword:import('import')
PsiErrorElement:Identifier expected
<empty list>
@@ -0,0 +1,18 @@
PsiJavaFile:UnclosedImport1.java
PsiImportList
PsiImportStatement
PsiKeyword:import('import')
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:java.awt
PsiJavaCodeReferenceElement:java
PsiIdentifier:java('java')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiIdentifier:awt('awt')
PsiReferenceParameterList
<empty list>
PsiJavaToken:DOT('.')
PsiJavaToken:ASTERISK('*')
PsiErrorElement:';' expected
<empty list>

Some files were not shown because too many files have changed in this diff Show More