Skip to content

Commit 04fc79a

Browse files
committed
Change in the For*Intention and ifIntention to generate through templates.
1 parent baadb10 commit 04fc79a

File tree

14 files changed

+105
-124
lines changed

14 files changed

+105
-124
lines changed

src/ro/redeul/google/go/intentions/statements/BaseBoolStatement.java

Lines changed: 0 additions & 64 deletions
This file was deleted.

src/ro/redeul/google/go/intentions/statements/ConvertStatementToForRangeIntention.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package ro.redeul.google.go.intentions.statements;
22

3-
import com.intellij.openapi.editor.Document;
3+
import com.intellij.codeInsight.template.impl.TemplateImpl;
44
import com.intellij.openapi.editor.Editor;
5-
import com.intellij.openapi.editor.RangeMarker;
65
import com.intellij.openapi.util.TextRange;
76
import com.intellij.psi.PsiElement;
87
import com.intellij.psi.PsiReference;
98
import com.intellij.psi.PsiWhiteSpace;
109
import org.jetbrains.annotations.NotNull;
10+
import ro.redeul.google.go.editor.TemplateUtil;
1111
import ro.redeul.google.go.intentions.Intention;
1212
import ro.redeul.google.go.intentions.IntentionExecutionException;
1313
import ro.redeul.google.go.lang.psi.expressions.GoExpr;
@@ -24,8 +24,9 @@
2424
import ro.redeul.google.go.lang.psi.utils.GoTypeUtils;
2525
import ro.redeul.google.go.util.GoUtil;
2626

27+
import java.util.ArrayList;
28+
2729
import static ro.redeul.google.go.lang.psi.utils.GoPsiUtils.findParentOfType;
28-
import static ro.redeul.google.go.util.EditorUtil.reformatPositions;
2930

3031
public class ConvertStatementToForRangeIntention extends Intention {
3132

@@ -78,15 +79,19 @@ protected boolean satisfiedBy(PsiElement element) {
7879
@Override
7980
protected void processIntention(@NotNull PsiElement element, Editor editor)
8081
throws IntentionExecutionException {
81-
Document document = editor.getDocument();
82+
83+
8284
TextRange textRange = statement.getTextRange();
83-
RangeMarker range = document.createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset());
84-
document.deleteString(textRange.getStartOffset(), textRange.getEndOffset());
85+
ArrayList<String> arguments = new ArrayList<String>();
86+
87+
88+
StringBuilder templateString = new StringBuilder();
8589

86-
StringBuilder iFString = new StringBuilder();
8790
String k = "k";
8891
String v = "v";
92+
8993
int i = 0;
94+
9095
while (GoUtil.TestDeclVar(expr, k)) {
9196
k = String.format("k%d", i);
9297
i++;
@@ -98,19 +103,13 @@ protected void processIntention(@NotNull PsiElement element, Editor editor)
98103
i++;
99104
}
100105

101-
iFString.append("for ")
102-
.append(k)
103-
.append(",")
104-
.append(v)
105-
.append(":= range ")
106-
.append(expr.getText())
107-
.append("{");
108106

109-
document.insertString(textRange.getStartOffset(), iFString.toString() + "}");
107+
arguments.add(k);
108+
arguments.add(v);
109+
110+
TemplateImpl template = TemplateUtil.createTemplate(String.format("for $v0$,$v1$ := range %s{$END$}", expr.getText()));
111+
TemplateUtil.runTemplate(editor, textRange, arguments, template);
110112

111-
if (editor != null)
112-
editor.getCaretModel().moveToOffset(textRange.getStartOffset() + 15 + v.length() + k.length() + expr.getTextLength());
113-
reformatPositions(statement.getContainingFile(), range);
114113
}
115114

116115
}
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,9 @@
11
package ro.redeul.google.go.intentions.statements;
22

3-
import com.intellij.openapi.editor.Document;
4-
import com.intellij.openapi.editor.Editor;
5-
import com.intellij.openapi.editor.RangeMarker;
6-
import com.intellij.openapi.util.TextRange;
7-
import com.intellij.psi.PsiElement;
8-
import org.jetbrains.annotations.NotNull;
9-
import ro.redeul.google.go.intentions.IntentionExecutionException;
10-
11-
import static ro.redeul.google.go.util.EditorUtil.reformatPositions;
12-
13-
public class ConvertStatementToForWhileIntention extends BaseBoolStatement {
3+
public class ConvertStatementToForWhileIntention extends ConvertStatementToIfIntention {
144

155
@Override
16-
protected void processIntention(@NotNull PsiElement element, Editor editor)
17-
throws IntentionExecutionException {
18-
Document document = editor.getDocument();
19-
TextRange textRange = statement.getTextRange();
20-
RangeMarker range = document.createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset());
21-
document.deleteString(textRange.getStartOffset(), textRange.getEndOffset());
22-
23-
document.insertString(textRange.getStartOffset(), "for " + expr.getText() + "{" + "}");
24-
if (editor != null) editor.getCaretModel().moveToOffset(textRange.getStartOffset() + 5 + expr.getTextLength());
25-
reformatPositions(statement.getContainingFile(), range);
6+
protected String getKeyword() {
7+
return "for";
268
}
27-
289
}
Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,94 @@
11
package ro.redeul.google.go.intentions.statements;
22

3-
import com.intellij.openapi.editor.Document;
3+
import com.intellij.codeInsight.template.impl.TemplateImpl;
44
import com.intellij.openapi.editor.Editor;
5-
import com.intellij.openapi.editor.RangeMarker;
65
import com.intellij.openapi.util.TextRange;
76
import com.intellij.psi.PsiElement;
7+
import com.intellij.psi.PsiWhiteSpace;
88
import org.jetbrains.annotations.NotNull;
9+
import ro.redeul.google.go.editor.TemplateUtil;
10+
import ro.redeul.google.go.intentions.Intention;
911
import ro.redeul.google.go.intentions.IntentionExecutionException;
12+
import ro.redeul.google.go.lang.psi.GoPsiElement;
13+
import ro.redeul.google.go.lang.psi.expressions.GoExpr;
14+
import ro.redeul.google.go.lang.psi.expressions.binary.GoLogicalAndExpression;
15+
import ro.redeul.google.go.lang.psi.expressions.binary.GoLogicalOrExpression;
16+
import ro.redeul.google.go.lang.psi.expressions.binary.GoRelationalExpression;
17+
import ro.redeul.google.go.lang.psi.expressions.literals.GoLiteralIdentifier;
18+
import ro.redeul.google.go.lang.psi.expressions.primary.GoLiteralExpression;
19+
import ro.redeul.google.go.lang.psi.statements.GoExpressionStatement;
20+
import ro.redeul.google.go.lang.psi.types.GoPsiType;
21+
import ro.redeul.google.go.lang.psi.types.GoPsiTypeName;
22+
import ro.redeul.google.go.lang.psi.typing.GoType;
23+
import ro.redeul.google.go.lang.psi.typing.GoTypePsiBacked;
24+
import ro.redeul.google.go.lang.psi.utils.GoTypeUtils;
25+
import ro.redeul.google.go.util.GoUtil;
1026

11-
import static ro.redeul.google.go.util.EditorUtil.reformatPositions;
27+
import java.util.ArrayList;
1228

29+
import static ro.redeul.google.go.lang.psi.utils.GoPsiUtils.findParentOfType;
1330

14-
public class ConvertStatementToIfIntention extends BaseBoolStatement {
1531

32+
public class ConvertStatementToIfIntention extends Intention {
33+
34+
35+
protected GoExpressionStatement statement;
36+
protected GoExpr expr;
37+
38+
@Override
39+
protected boolean satisfiedBy(PsiElement element) {
40+
statement = element instanceof GoExpressionStatement ? (GoExpressionStatement) element : findParentOfType(element, GoExpressionStatement.class);
41+
if (statement == null && element instanceof PsiWhiteSpace && element.getPrevSibling() instanceof GoExpressionStatement) {
42+
statement = (GoExpressionStatement) element.getPrevSibling();
43+
}
44+
if (statement != null) {
45+
expr = statement.getExpression();
46+
if (expr != null) {
47+
if (expr instanceof GoRelationalExpression
48+
|| expr instanceof GoLogicalAndExpression
49+
|| expr instanceof GoLogicalOrExpression)
50+
return true;
51+
52+
for (GoType goType : expr.getType()) {
53+
if (goType != null) {
54+
if (goType instanceof GoTypePsiBacked) {
55+
GoPsiType psiType = GoTypeUtils.resolveToFinalType(((GoTypePsiBacked) goType).getPsiType());
56+
if (psiType instanceof GoPsiTypeName)
57+
return psiType.getText().equals("bool") && ((GoPsiTypeName) psiType).isPrimitive();
58+
}
59+
}
60+
}
61+
if (expr instanceof GoLiteralExpression) {
62+
PsiElement literal = ((GoLiteralExpression) expr).getLiteral();
63+
if (literal instanceof GoLiteralIdentifier) {
64+
literal = GoUtil.ResolveTypeOfVarDecl((GoPsiElement) literal);
65+
if (literal.getText().equals("true") || literal.getText().equals("false")) {
66+
return true;
67+
}
68+
}
69+
}
70+
}
71+
}
72+
return false;
73+
}
74+
75+
protected String getKeyword() {
76+
return "if";
77+
}
1678

1779
@Override
1880
protected void processIntention(@NotNull PsiElement element, Editor editor)
1981
throws IntentionExecutionException {
20-
Document document = editor.getDocument();
82+
2183
TextRange textRange = statement.getTextRange();
22-
RangeMarker range = document.createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset());
23-
document.deleteString(textRange.getStartOffset(), textRange.getEndOffset());
24-
document.insertString(textRange.getStartOffset(), "if " + expr.getText() + "{" + "}");
25-
if (editor != null) editor.getCaretModel().moveToOffset(textRange.getStartOffset() + 4 + expr.getTextLength());
26-
reformatPositions(statement.getContainingFile(), range);
84+
85+
GoType[] types = expr.getType();
86+
TemplateImpl template;
87+
88+
template = TemplateUtil.createTemplate(String.format("%s %s {$END$}", getKeyword(), expr.getText()));
89+
90+
TemplateUtil.runTemplate(editor, textRange, new ArrayList<String>(), template);
91+
2792
}
2893

2994
}

testdata/intentions/statements/convertStatementToForRangeIntention/callMapExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ func GetMap()map[string]string{
1111
return map[string]string{}
1212
}
1313
func main() {
14-
for k,v:= range GetMap(){<caret>}
14+
for k, v := range GetMap() {<caret>}
1515
}

testdata/intentions/statements/convertStatementToForRangeIntention/callSliceExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ func GetSlice()[]string{
1111
return []string{}
1212
}
1313
func main() {
14-
for k,v:= range GetSlice(){<caret>}
14+
for k, v := range GetSlice() {<caret>}
1515
}

testdata/intentions/statements/convertStatementToForRangeIntention/subTypeExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ func GetSlice()Values{
1919
}
2020
func main() {
2121
slice:=GetSlice()
22-
for k,v:= range slice{<caret>}
22+
for k, v := range slice {<caret>}
2323
}

testdata/intentions/statements/convertStatementToForRangeIntention/subTypeInRangeValExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ func GetSlice()Values{
2222
func main() {
2323
slice:=GetSlice()
2424
for k,v:= range slice{
25-
for k0,v0:= range v{<caret>}
25+
for k0, v0 := range v {<caret>}
2626
}
2727
}

testdata/intentions/statements/convertStatementToForRangeIntention/varSliceExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ func GetSlice()[]string{
1313
}
1414
func main() {
1515
slice:=GetSlice()
16-
for k,v:= range slice{<caret>}
16+
for k, v := range slice {<caret>}
1717
}

testdata/intentions/statements/convertStatementToForRangeIntention/variadicSliceExpression.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ func main() {
88
-----
99
package main
1010
func VariadicFn(str_list ...string){
11-
for k,v:= range str_list{<caret>}
11+
for k, v := range str_list {<caret>}
1212
}
1313
func main() {
1414
VariadicFn("str_1","str_2")

0 commit comments

Comments
 (0)