mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EA-52654 - NPE: TemplateState.setCurrentVariableNumber
This commit is contained in:
+13
-14
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2013 JetBrains s.r.o.
|
||||
* Copyright 2000-2014 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.
|
||||
@@ -80,11 +80,11 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
Editor editor = event.getEditor();
|
||||
if (editor.getProject() != null && editor.getProject() != myProject) return;
|
||||
if (myProject.isDisposed() || !myProject.isOpen()) return;
|
||||
TemplateState tState = getTemplateState(editor);
|
||||
if (tState != null) {
|
||||
tState.gotoEnd();
|
||||
TemplateState state = getTemplateState(editor);
|
||||
if (state != null) {
|
||||
state.gotoEnd();
|
||||
}
|
||||
editor.putUserData(TEMPLATE_STATE_KEY, null);
|
||||
clearTemplateState(editor);
|
||||
}
|
||||
};
|
||||
EditorFactory.getInstance().addEditorFactoryListener(myEditorFactoryListener, myProject);
|
||||
@@ -108,8 +108,8 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
});
|
||||
}
|
||||
|
||||
private static void disposeState(final TemplateState tState) {
|
||||
Disposer.dispose(tState);
|
||||
private static void disposeState(@NotNull TemplateState state) {
|
||||
Disposer.dispose(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -123,11 +123,11 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static TemplateState getTemplateState(Editor editor) {
|
||||
public static TemplateState getTemplateState(@NotNull Editor editor) {
|
||||
return editor.getUserData(TEMPLATE_STATE_KEY);
|
||||
}
|
||||
|
||||
void clearTemplateState(final Editor editor) {
|
||||
static void clearTemplateState(@NotNull Editor editor) {
|
||||
TemplateState prevState = getTemplateState(editor);
|
||||
if (prevState != null) {
|
||||
disposeState(prevState);
|
||||
@@ -135,7 +135,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
editor.putUserData(TEMPLATE_STATE_KEY, null);
|
||||
}
|
||||
|
||||
private TemplateState initTemplateState(final Editor editor) {
|
||||
private TemplateState initTemplateState(@NotNull Editor editor) {
|
||||
clearTemplateState(editor);
|
||||
TemplateState state = new TemplateState(myProject, editor);
|
||||
Disposer.register(this, state);
|
||||
@@ -379,7 +379,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
final Document document = editor.getDocument();
|
||||
final CharSequence text = document.getCharsSequence();
|
||||
|
||||
if (template2argument == null || template2argument.size() == 0) {
|
||||
if (template2argument == null || template2argument.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (!FileDocumentManager.getInstance().requestWriting(editor.getDocument(), myProject)) {
|
||||
@@ -407,14 +407,13 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
@Nullable Character shortcutChar,
|
||||
TemplateSettings settings,
|
||||
boolean hasArgument) {
|
||||
String key;
|
||||
List<TemplateImpl> candidates = Collections.emptyList();
|
||||
for (int i = settings.getMaxKeyLength(); i >= 1; i--) {
|
||||
int wordStart = caretOffset - i;
|
||||
if (wordStart < 0) {
|
||||
continue;
|
||||
}
|
||||
key = text.subSequence(wordStart, caretOffset).toString();
|
||||
String key = text.subSequence(wordStart, caretOffset).toString();
|
||||
if (Character.isJavaIdentifierStart(key.charAt(0))) {
|
||||
if (wordStart > 0 && Character.isJavaIdentifierPart(text.charAt(wordStart - 1))) {
|
||||
continue;
|
||||
@@ -519,7 +518,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
|
||||
final TemplateContextType[] typeCollection = getAllContextTypes();
|
||||
LinkedList<TemplateContextType> userDefinedExtensionsFirst = new LinkedList<TemplateContextType>();
|
||||
for (TemplateContextType contextType : typeCollection) {
|
||||
if (contextType.getClass().getName().startsWith("com.intellij.codeInsight.template")) {
|
||||
if (contextType.getClass().getName().startsWith(Template.class.getPackage().getName())) {
|
||||
userDefinedExtensionsFirst.addLast(contextType);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2013 JetBrains s.r.o.
|
||||
* Copyright 2000-2014 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.
|
||||
@@ -93,6 +93,7 @@ public class TemplateState implements Disposable {
|
||||
private boolean myFinished;
|
||||
@Nullable private PairProcessor<String, String> myProcessor;
|
||||
private boolean mySelectionCalculated = false;
|
||||
private boolean myStarted;
|
||||
|
||||
public TemplateState(@NotNull Project project, final Editor editor) {
|
||||
myProject = project;
|
||||
@@ -134,32 +135,27 @@ public class TemplateState implements Disposable {
|
||||
final LookupImpl lookup = myEditor != null ? (LookupImpl)LookupManager.getActiveLookup(myEditor) : null;
|
||||
if (lookup != null) {
|
||||
lookup.performGuardedChange(runnable);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
runnable.run();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
myDocument.addDocumentListener(myEditorDocumentListener);
|
||||
CommandProcessor.getInstance().addCommandListener(myCommandListener);
|
||||
myDocument.addDocumentListener(myEditorDocumentListener, this);
|
||||
CommandProcessor.getInstance().addCommandListener(myCommandListener, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void dispose() {
|
||||
if (myEditorDocumentListener != null) {
|
||||
myDocument.removeDocumentListener(myEditorDocumentListener);
|
||||
myEditorDocumentListener = null;
|
||||
}
|
||||
if (myCommandListener != null) {
|
||||
CommandProcessor.getInstance().removeCommandListener(myCommandListener);
|
||||
myCommandListener = null;
|
||||
}
|
||||
myEditorDocumentListener = null;
|
||||
myCommandListener = null;
|
||||
|
||||
myProcessor = null;
|
||||
|
||||
//Avoid the leak of the editor
|
||||
releaseEditor();
|
||||
releaseAll();
|
||||
myDocument = null;
|
||||
}
|
||||
|
||||
@@ -176,7 +172,7 @@ public class TemplateState implements Disposable {
|
||||
|
||||
private void setCurrentVariableNumber(int variableNumber) {
|
||||
myCurrentVariableNumber = variableNumber;
|
||||
final boolean isFinished = variableNumber < 0;
|
||||
final boolean isFinished = isFinished();
|
||||
((DocumentEx)myDocument).setStripTrailingSpacesEnabled(isFinished);
|
||||
myCurrentSegmentNumber = isFinished ? -1 : getCurrentSegmentNumber();
|
||||
}
|
||||
@@ -262,9 +258,11 @@ public class TemplateState implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
public void start(TemplateImpl template,
|
||||
public void start(@NotNull TemplateImpl template,
|
||||
@Nullable final PairProcessor<String, String> processor,
|
||||
@Nullable Map<String, String> predefinedVarValues) {
|
||||
LOG.assertTrue(!myStarted, "Already started");
|
||||
myStarted = true;
|
||||
myTemplate = template;
|
||||
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
|
||||
|
||||
@@ -328,7 +326,7 @@ public class TemplateState implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
private void processAllExpressions(final TemplateImpl template) {
|
||||
private void processAllExpressions(@NotNull final TemplateImpl template) {
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -365,7 +363,7 @@ public class TemplateState implements Disposable {
|
||||
});
|
||||
}
|
||||
|
||||
public void doReformat(final TextRange range) {
|
||||
private void doReformat(final TextRange range) {
|
||||
RangeMarker rangeMarker = null;
|
||||
if (range != null) {
|
||||
rangeMarker = myDocument.createRangeMarker(range);
|
||||
@@ -876,14 +874,20 @@ public class TemplateState implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
boolean isDisposed() {
|
||||
return myDocument == null;
|
||||
}
|
||||
|
||||
private void cleanupTemplateState(boolean brokenOff) {
|
||||
final Editor editor = myEditor;
|
||||
fireBeforeTemplateFinished();
|
||||
int oldVar = myCurrentVariableNumber;
|
||||
setCurrentVariableNumber(-1);
|
||||
currentVariableChanged(oldVar);
|
||||
((TemplateManagerImpl)TemplateManager.getInstance(myProject)).clearTemplateState(editor);
|
||||
fireTemplateFinished(brokenOff);
|
||||
if (!isDisposed()) {
|
||||
setCurrentVariableNumber(-1);
|
||||
TemplateManagerImpl.clearTemplateState(editor);
|
||||
fireTemplateFinished(brokenOff);
|
||||
}
|
||||
myListeners.clear();
|
||||
myProject = null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user