fix for AST operations

This commit is contained in:
Anna Kozlova
2008-03-12 14:23:24 +03:00
parent 438ab2bfd1
commit fb9c01080b
3 changed files with 25 additions and 15 deletions
@@ -100,6 +100,7 @@ public class PythonParserDefinition implements ParserDefinition {
}
public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) {
if(left.getElementType() == PyTokenTypes.END_OF_LINE_COMMENT) return SpaceRequirements.MUST_LINE_BREAK;
final Lexer lexer = createLexer(left.getPsi().getProject());
return LanguageUtil.canStickTokensTogetherByLexer(left, right, lexer, 0);
}
@@ -24,11 +24,11 @@ import com.intellij.psi.TokenType;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonLanguage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
@@ -191,7 +191,9 @@ public class PyBlock implements Block {
IElementType parentType = _node.getElementType();
IElementType type1 = childNode1.getElementType();
IElementType type2 = childNode2.getElementType();
if (PyElementTypes.STATEMENTS.contains(type1) && PyElementTypes.STATEMENTS.contains(type2)){
return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, false, 1);
}
/*
if (type1 == PyTokenTypes.COLON && type2 == PyElementTypes.STATEMENT_LIST) {
return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, true, Integer.MAX_VALUE);
@@ -212,6 +214,7 @@ public class PyBlock implements Block {
//return new PySpacingProcessor(getNode(), childNode1, childNode2,
// _settings).getResult();
//return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, true, Integer.MAX_VALUE);
return null;
}
@@ -8,24 +8,27 @@ import com.intellij.codeInsight.daemon.impl.ShowAutoImportPass;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.hint.QuestionAction;
import com.intellij.codeInspection.HintAction;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.Factory;
import com.intellij.psi.impl.source.tree.LeafElement;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.psi.PyImportStatement;
import com.jetbrains.python.psi.PyReferenceExpression;
import org.jetbrains.annotations.NotNull;
public class AddImportAction implements HintAction, QuestionAction {
private final PsiReference myReference;
private Project myProject;
private static final Logger LOG = Logger.getInstance("#" + AddImportAction.class.getName());
public AddImportAction(final PsiReference reference) {
myReference = reference;
@@ -62,20 +65,23 @@ public class AddImportAction implements HintAction, QuestionAction {
final String referenceName = ((PyReferenceExpression)myReference).getReferencedName();
final PsiFile[] files = FilenameIndex.getFilesByName(myProject, referenceName + ".py", GlobalSearchScope.allScope(myProject));
if (files.length == 1) {
String text = "\n";
LeafElement ws = Factory.createSingleLeafElement(TokenType.WHITE_SPACE, text, 0, text.length(), null, file.getManager());
final ASTNode importNodeToInsert = PythonLanguage.getInstance().getElementGenerator()
.createImportStatementFromText(myProject, "import " + referenceName).getNode();
final PsiElement element = getFirstNonComment(file);
file.getNode().addChild(importNodeToInsert, element != null ? element.getNode() : file.getFirstChild().getNode());
file.getNode().addChild(ws, importNodeToInsert);
final PyImportStatement importNodeToInsert = PythonLanguage.getInstance().getElementGenerator().createImportStatementFromText(myProject, "import " + referenceName);
try {
file.addBefore(importNodeToInsert, getFirstNonComment(file));
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
}
});
}
private static PsiElement getFirstNonComment(final PsiFile file) {
return PsiTreeUtil.skipSiblingsForward(file.getFirstChild(), PsiComment.class);
final PsiElement firstChild = file.getFirstChild();
LOG.assertTrue(firstChild != null);
final PsiElement element = PsiTreeUtil.skipSiblingsForward(firstChild, PsiComment.class);
return element != null ? element : firstChild;
}
public boolean startInWriteAction() {