use of org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection in project intellij-community by JetBrains.
the class StringPartInfo method areInjectionsCut.
private static boolean areInjectionsCut(GrString literal, int startOffset, int endOffset) {
TextRange selectionRange = new TextRange(startOffset, endOffset);
GrStringInjection[] injections = literal.getInjections();
for (GrStringInjection injection : injections) {
TextRange range = injection.getTextRange();
if (!selectionRange.contains(range) && !range.contains(selectionRange) && range.intersects(selectionRange)) {
return true;
}
}
return false;
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection in project intellij-community by JetBrains.
the class ControlFlowBuilder method visitClosure.
@Override
public void visitClosure(@NotNull GrClosableBlock closure) {
//do not go inside closures except gstring injections
if (closure.getParent() instanceof GrStringInjection) {
for (GrParameter parameter : closure.getAllParameters()) {
if (myPolicy.isVariableInitialized(parameter)) {
addNode(new ReadWriteVariableInstruction(parameter.getName(), parameter, ReadWriteVariableInstruction.WRITE));
}
}
addNode(new ReadWriteVariableInstruction("owner", closure.getLBrace(), ReadWriteVariableInstruction.WRITE));
super.visitClosure(closure);
return;
}
ReadWriteVariableInstruction[] reads = ControlFlowBuilderUtil.getReadsWithoutPriorWrites(closure.getControlFlow(), false);
for (ReadWriteVariableInstruction read : reads) {
PsiElement element = read.getElement();
if (!(element instanceof GrReferenceExpression) || myPolicy.isReferenceAccepted((GrReferenceExpression) element)) {
addNodeAndCheckPending(new ReadWriteVariableInstruction(read.getVariableName(), closure, ReadWriteVariableInstruction.READ));
}
}
addNodeAndCheckPending(new InstructionImpl(closure));
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection in project intellij-community by JetBrains.
the class ConvertMultilineStringToSingleLineIntention method processIntention.
@Override
protected void processIntention(@NotNull PsiElement element, @NotNull Project project, Editor editor) throws IncorrectOperationException {
String quote = element.getText().substring(0, 1);
StringBuilder buffer = new StringBuilder();
buffer.append(quote);
GrExpression old;
if (element instanceof GrLiteralImpl) {
appendSimpleStringValue(element, buffer, quote);
old = (GrExpression) element;
} else {
final GrStringImpl gstring = (GrStringImpl) element;
for (GroovyPsiElement child : gstring.getAllContentParts()) {
if (child instanceof GrStringContent) {
appendSimpleStringValue(child, buffer, "\"");
} else if (child instanceof GrStringInjection) {
buffer.append(child.getText());
}
}
old = gstring;
}
buffer.append(quote);
try {
final int offset = editor.getCaretModel().getOffset();
final TextRange range = old.getTextRange();
int shift;
if (range.getStartOffset() == offset) {
shift = 0;
} else if (range.getStartOffset() == offset - 1) {
shift = -1;
} else if (range.getEndOffset() == offset) {
shift = -4;
} else if (range.getEndOffset() == offset + 1) {
shift = -3;
} else {
shift = -2;
}
final GrExpression newLiteral = GroovyPsiElementFactory.getInstance(project).createExpressionFromText(buffer.toString());
old.replaceWithExpression(newLiteral, true);
if (shift != 0) {
editor.getCaretModel().moveToOffset(offset + shift);
}
} catch (IncorrectOperationException e) {
LOG.error(e);
}
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection in project intellij-community by JetBrains.
the class ConvertToRegexIntention method processIntention.
@Override
protected void processIntention(@NotNull PsiElement element, @NotNull Project project, Editor editor) throws IncorrectOperationException {
if (!(element instanceof GrLiteral))
return;
StringBuilder buffer = new StringBuilder();
buffer.append("/");
if (GrStringUtil.isDollarSlashyString(((GrLiteral) element))) {
buffer.append(GrStringUtil.removeQuotes(element.getText()));
} else if (element instanceof GrLiteralImpl) {
Object value = ((GrLiteralImpl) element).getValue();
if (value instanceof String) {
GrStringUtil.escapeSymbolsForSlashyStrings(buffer, (String) value);
} else {
String rawText = GrStringUtil.removeQuotes(element.getText());
unescapeAndAppend(buffer, rawText);
}
} else if (element instanceof GrString) {
for (PsiElement part : ((GrString) element).getAllContentParts()) {
if (part instanceof GrStringContent) {
unescapeAndAppend(buffer, part.getText());
} else if (part instanceof GrStringInjection) {
buffer.append(part.getText());
}
}
}
buffer.append("/");
GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(project);
GrExpression regex = factory.createExpressionFromText(buffer);
//don't use replaceWithExpression since it can revert regex to string if regex brakes syntax
element.replace(regex);
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection in project intellij-community by JetBrains.
the class GroovyGStringSelectioner method select.
@Override
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
final List<TextRange> ranges = ContainerUtil.newArrayList();
final PsiElement parent = e.getParent();
if (parent instanceof GrStringContent && parent.getParent() instanceof GrString) {
TextRange range = getLineTextRange(parent, cursorOffset);
ranges.add(range);
} else if (parent instanceof GrString) {
PsiElement firstChild = parent.getFirstChild();
PsiElement lastChild = parent.getLastChild();
if (firstChild.getNode().getElementType() == GroovyTokenTypes.mGSTRING_BEGIN) {
firstChild = firstChild.getNextSibling();
}
if (lastChild.getNode().getElementType() == GroovyTokenTypes.mGSTRING_END) {
lastChild = lastChild.getPrevSibling();
}
if (firstChild != null && lastChild != null) {
TextRange range = new TextRange(firstChild.getTextOffset(), lastChild.getTextOffset() + lastChild.getTextLength());
ranges.add(range);
}
ranges.add(parent.getTextRange());
} else if (parent instanceof GrStringInjection) {
if (e instanceof GrReferenceExpression) {
List<TextRange> r = new ArrayList<>(2);
SelectWordUtil.addWordSelection(editor.getSettings().isCamelWords(), editorText, cursorOffset, r);
for (TextRange textRange : r) {
if (editorText.charAt(textRange.getStartOffset()) == '$') {
textRange = new TextRange(textRange.getStartOffset() + 1, textRange.getEndOffset());
}
ranges.add(textRange);
}
}
ranges.add(parent.getTextRange());
ranges.add(e.getTextRange());
}
return ranges;
}
Aggregations