Skip to content

Commit 8c0b391

Browse files
Merge pull request #48 from protostuff/feature/rename-refactoring
#46: Rename refactoring
2 parents bab2042 + a55e373 commit 8c0b391

File tree

58 files changed

+1100
-281
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1100
-281
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ dependencies {
3232
exclude group: 'com.jetbrains'
3333
}
3434
compile 'com.google.guava:guava:21.0'
35-
compile 'io.protostuff:protostuff-parser:2.0.0-alpha38'
35+
compile 'io.protostuff:protostuff-parser:2.1.11'
3636
}
3737

3838
apply plugin: 'idea'

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Available idea versions:
22
# https://www.jetbrains.com/intellij-repository/releases
33
# https://www.jetbrains.com/intellij-repository/snapshots
4-
version=0.8.0
4+
version=0.9.0
55
ideaVersion=2017.1
66
# https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under
77
# Java 8 is required to run IntelliJ IDEA starting from version 16

src/main/java/io/protostuff/jetbrains/plugin/ProtoParserDefinition.java

Lines changed: 118 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,51 @@
55
import static io.protostuff.compiler.parser.ProtoLexer.NL;
66
import static io.protostuff.compiler.parser.ProtoLexer.STRING_VALUE;
77
import static io.protostuff.compiler.parser.ProtoLexer.WS;
8+
import static io.protostuff.compiler.parser.ProtoParser.RULE_customFieldReference;
9+
import static io.protostuff.compiler.parser.ProtoParser.RULE_enumBlock;
10+
import static io.protostuff.compiler.parser.ProtoParser.RULE_enumField;
11+
import static io.protostuff.compiler.parser.ProtoParser.RULE_enumName;
12+
import static io.protostuff.compiler.parser.ProtoParser.RULE_extendBlock;
13+
import static io.protostuff.compiler.parser.ProtoParser.RULE_extendBlockEntry;
14+
import static io.protostuff.compiler.parser.ProtoParser.RULE_extensions;
15+
import static io.protostuff.compiler.parser.ProtoParser.RULE_field;
16+
import static io.protostuff.compiler.parser.ProtoParser.RULE_fieldModifier;
17+
import static io.protostuff.compiler.parser.ProtoParser.RULE_fieldName;
18+
import static io.protostuff.compiler.parser.ProtoParser.RULE_fieldRerefence;
19+
import static io.protostuff.compiler.parser.ProtoParser.RULE_fileReference;
20+
import static io.protostuff.compiler.parser.ProtoParser.RULE_groupBlock;
21+
import static io.protostuff.compiler.parser.ProtoParser.RULE_ident;
22+
import static io.protostuff.compiler.parser.ProtoParser.RULE_importStatement;
23+
import static io.protostuff.compiler.parser.ProtoParser.RULE_map;
24+
import static io.protostuff.compiler.parser.ProtoParser.RULE_mapKey;
25+
import static io.protostuff.compiler.parser.ProtoParser.RULE_messageBlock;
26+
import static io.protostuff.compiler.parser.ProtoParser.RULE_messageName;
27+
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneof;
28+
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneofName;
29+
import static io.protostuff.compiler.parser.ProtoParser.RULE_option;
30+
import static io.protostuff.compiler.parser.ProtoParser.RULE_optionEntry;
31+
import static io.protostuff.compiler.parser.ProtoParser.RULE_optionValue;
32+
import static io.protostuff.compiler.parser.ProtoParser.RULE_packageStatement;
33+
import static io.protostuff.compiler.parser.ProtoParser.RULE_proto;
34+
import static io.protostuff.compiler.parser.ProtoParser.RULE_range;
35+
import static io.protostuff.compiler.parser.ProtoParser.RULE_reservedFieldNames;
36+
import static io.protostuff.compiler.parser.ProtoParser.RULE_reservedFieldRanges;
37+
import static io.protostuff.compiler.parser.ProtoParser.RULE_rpcMethod;
38+
import static io.protostuff.compiler.parser.ProtoParser.RULE_rpcName;
39+
import static io.protostuff.compiler.parser.ProtoParser.RULE_rpcType;
40+
import static io.protostuff.compiler.parser.ProtoParser.RULE_serviceBlock;
41+
import static io.protostuff.compiler.parser.ProtoParser.RULE_serviceName;
42+
import static io.protostuff.compiler.parser.ProtoParser.RULE_standardFieldRerefence;
43+
import static io.protostuff.compiler.parser.ProtoParser.RULE_syntaxStatement;
44+
import static io.protostuff.compiler.parser.ProtoParser.RULE_tag;
45+
import static io.protostuff.compiler.parser.ProtoParser.RULE_typeReference;
46+
import static io.protostuff.compiler.parser.ProtoParser.ruleNames;
847

948
import com.intellij.lang.ASTNode;
1049
import com.intellij.lang.ParserDefinition;
1150
import com.intellij.lang.PsiParser;
1251
import com.intellij.lexer.Lexer;
52+
import com.intellij.openapi.diagnostic.Logger;
1353
import com.intellij.openapi.project.Project;
1454
import com.intellij.psi.FileViewProvider;
1555
import com.intellij.psi.PsiFile;
@@ -27,14 +67,13 @@
2767
import io.protostuff.jetbrains.plugin.psi.FieldNode;
2868
import io.protostuff.jetbrains.plugin.psi.FieldReferenceNode;
2969
import io.protostuff.jetbrains.plugin.psi.FileReferenceNode;
70+
import io.protostuff.jetbrains.plugin.psi.GenericNameNode;
3071
import io.protostuff.jetbrains.plugin.psi.GroupNode;
3172
import io.protostuff.jetbrains.plugin.psi.ImportNode;
3273
import io.protostuff.jetbrains.plugin.psi.MapKeyNode;
3374
import io.protostuff.jetbrains.plugin.psi.MapNode;
34-
import io.protostuff.jetbrains.plugin.psi.MessageNameNode;
3575
import io.protostuff.jetbrains.plugin.psi.MessageNode;
3676
import io.protostuff.jetbrains.plugin.psi.OneOfNode;
37-
import io.protostuff.jetbrains.plugin.psi.OneofFieldNode;
3877
import io.protostuff.jetbrains.plugin.psi.OptionEntryNode;
3978
import io.protostuff.jetbrains.plugin.psi.OptionNode;
4079
import io.protostuff.jetbrains.plugin.psi.OptionValueNode;
@@ -50,6 +89,8 @@
5089
import io.protostuff.jetbrains.plugin.psi.StandardFieldReferenceNode;
5190
import io.protostuff.jetbrains.plugin.psi.SyntaxStatement;
5291
import io.protostuff.jetbrains.plugin.psi.TypeReferenceNode;
92+
import java.lang.reflect.Method;
93+
import java.util.Collections;
5394
import java.util.HashMap;
5495
import java.util.List;
5596
import java.util.Map;
@@ -71,6 +112,8 @@
71112
*/
72113
public class ProtoParserDefinition implements ParserDefinition {
73114

115+
private static final Logger LOGGER = Logger.getInstance(ProtoParserDefinition.class);
116+
74117
public static final PsiElementTypeFactory ELEMENT_FACTORY = PsiElementTypeFactory.create(ProtoLanguage.INSTANCE, new ProtoParser(null));
75118
public static final TokenSet KEYWORDS = ELEMENT_FACTORY.createTokenSet(
76119
ProtoLexer.PACKAGE,
@@ -218,51 +261,70 @@ public class ProtoParserDefinition implements ParserDefinition {
218261
public static final TokenIElementType ASSIGN = TOKEN_TYPES.get(ProtoLexer.ASSIGN);
219262
private static final List<RuleIElementType> RULE_TYPES = ELEMENT_FACTORY.getRuleIElementTypes();
220263
// Rules
221-
public static final IElementType R_TYPE_REFERENCE = RULE_TYPES.get(ProtoParser.RULE_typeReference);
222-
public static final IElementType R_NAME = RULE_TYPES.get(ProtoParser.RULE_ident);
223-
public static final IElementType R_FIELD_MODIFIER = RULE_TYPES.get(ProtoParser.RULE_fieldModifier);
224-
public static final IElementType R_FIELD_NAME = RULE_TYPES.get(ProtoParser.RULE_fieldName);
225-
public static final IElementType R_TAG = RULE_TYPES.get(ProtoParser.RULE_tag);
264+
public static final IElementType R_TYPE_REFERENCE = RULE_TYPES.get(RULE_typeReference);
265+
public static final IElementType R_NAME = RULE_TYPES.get(RULE_ident);
266+
public static final IElementType R_FIELD_MODIFIER = RULE_TYPES.get(RULE_fieldModifier);
267+
public static final IElementType R_FIELD_NAME = RULE_TYPES.get(RULE_fieldName);
268+
public static final IElementType R_TAG = RULE_TYPES.get(RULE_tag);
226269
private static final IFileElementType FILE = new IFileElementType(ProtoLanguage.INSTANCE);
227270
private static final TokenSet COMMENTS = ELEMENT_FACTORY.createTokenSet(COMMENT, LINE_COMMENT);
228271
private static final TokenSet STRING = ELEMENT_FACTORY.createTokenSet(STRING_VALUE);
229272
private final Map<Integer, Function<ASTNode, AntlrPsiNode>> elementFactories = new HashMap<>();
230273

274+
private final Map<String, Method> parserRuleMethods = createParserRuleMethods();
275+
231276
/**
232277
* Create new parser definition.
233278
*/
234279
public ProtoParserDefinition() {
235-
register(ProtoParser.RULE_syntaxStatement, SyntaxStatement::new);
236-
register(ProtoParser.RULE_packageStatement, PackageStatement::new);
237-
register(ProtoParser.RULE_importStatement, ImportNode::new);
238-
register(ProtoParser.RULE_fileReference, FileReferenceNode::new);
239-
register(ProtoParser.RULE_messageBlock, MessageNode::new);
240-
register(ProtoParser.RULE_messageName, MessageNameNode::new);
241-
register(ProtoParser.RULE_field, FieldNode::new);
242-
register(ProtoParser.RULE_typeReference, TypeReferenceNode::new);
243-
register(ProtoParser.RULE_groupBlock, GroupNode::new);
244-
register(ProtoParser.RULE_enumBlock, EnumNode::new);
245-
register(ProtoParser.RULE_enumField, EnumConstantNode::new);
246-
register(ProtoParser.RULE_serviceBlock, ServiceNode::new);
247-
register(ProtoParser.RULE_rpcMethod, RpcMethodNode::new);
248-
register(ProtoParser.RULE_optionEntry, OptionEntryNode::new);
249-
register(ProtoParser.RULE_option, OptionNode::new);
250-
register(ProtoParser.RULE_fieldRerefence, FieldReferenceNode::new);
251-
register(ProtoParser.RULE_standardFieldRerefence, StandardFieldReferenceNode::new);
252-
register(ProtoParser.RULE_customFieldReference, CustomFieldReferenceNode::new);
253-
register(ProtoParser.RULE_optionValue, OptionValueNode::new);
254-
register(ProtoParser.RULE_oneof, OneOfNode::new);
255-
register(ProtoParser.RULE_oneofField, OneofFieldNode::new);
256-
register(ProtoParser.RULE_extendBlock, ExtendNode::new);
257-
register(ProtoParser.RULE_extendBlockEntry, ExtendEntryNode::new);
258-
register(ProtoParser.RULE_extensions, ExtensionsNode::new);
259-
register(ProtoParser.RULE_map, MapNode::new);
260-
register(ProtoParser.RULE_mapKey, MapKeyNode::new);
261-
register(ProtoParser.RULE_range, RangeNode::new);
262-
register(ProtoParser.RULE_reservedFieldRanges, ReservedFieldRangesNode::new);
263-
register(ProtoParser.RULE_reservedFieldNames, ReservedFieldNamesNode::new);
264-
register(ProtoParser.RULE_rpcType, RpcMethodTypeNode::new);
265-
register(ProtoParser.RULE_proto, ProtoRootNode::new);
280+
register(RULE_customFieldReference, CustomFieldReferenceNode::new);
281+
register(RULE_enumBlock, EnumNode::new);
282+
register(RULE_enumField, EnumConstantNode::new);
283+
register(RULE_enumName, GenericNameNode::new);
284+
register(RULE_extendBlock, ExtendNode::new);
285+
register(RULE_extendBlockEntry, ExtendEntryNode::new);
286+
register(RULE_extensions, ExtensionsNode::new);
287+
register(RULE_field, FieldNode::new);
288+
register(RULE_fieldName, GenericNameNode::new);
289+
register(RULE_fieldRerefence, FieldReferenceNode::new);
290+
register(RULE_fileReference, FileReferenceNode::new);
291+
register(RULE_groupBlock, GroupNode::new);
292+
register(RULE_importStatement, ImportNode::new);
293+
register(RULE_map, MapNode::new);
294+
register(RULE_mapKey, MapKeyNode::new);
295+
register(RULE_messageBlock, MessageNode::new);
296+
register(RULE_messageName, GenericNameNode::new);
297+
register(RULE_oneof, OneOfNode::new);
298+
register(RULE_oneofName, GenericNameNode::new);
299+
register(RULE_option, OptionNode::new);
300+
register(RULE_optionEntry, OptionEntryNode::new);
301+
register(RULE_optionValue, OptionValueNode::new);
302+
register(RULE_packageStatement, PackageStatement::new);
303+
register(RULE_proto, ProtoRootNode::new);
304+
register(RULE_range, RangeNode::new);
305+
register(RULE_reservedFieldNames, ReservedFieldNamesNode::new);
306+
register(RULE_reservedFieldRanges, ReservedFieldRangesNode::new);
307+
register(RULE_rpcMethod, RpcMethodNode::new);
308+
register(RULE_rpcType, RpcMethodTypeNode::new);
309+
register(RULE_rpcName, GenericNameNode::new);
310+
register(RULE_serviceBlock, ServiceNode::new);
311+
register(RULE_serviceName, GenericNameNode::new);
312+
register(RULE_standardFieldRerefence, StandardFieldReferenceNode::new);
313+
register(RULE_typeReference, TypeReferenceNode::new);
314+
register(RULE_syntaxStatement, SyntaxStatement::new);
315+
}
316+
317+
private Map<String, Method> createParserRuleMethods() {
318+
Map<String, Method> result = new HashMap<>();
319+
for (String ruleName : ruleNames) {
320+
try {
321+
Method method = ProtoParser.class.getMethod(ruleName);
322+
result.put(ruleName, method);
323+
} catch (NoSuchMethodException e) {
324+
LOGGER.error("Could not get parser method for rule " + ruleName);
325+
}
326+
}
327+
return Collections.unmodifiableMap(result);
266328
}
267329

268330
public static TokenIElementType token(int token) {
@@ -294,22 +356,33 @@ public PsiParser createParser(Project project) {
294356
@Override
295357
protected ParseTree parse(Parser parser, IElementType root) {
296358
// start rule depends on root passed in; sometimes we want to create an ID node etc...
359+
ProtoParser protoParser = (ProtoParser) parser;
297360
if (root instanceof IFileElementType) {
298-
return ((ProtoParser) parser).proto();
361+
return protoParser.proto();
299362
}
300363
if (root instanceof RuleIElementType) {
301364
RuleIElementType type = (RuleIElementType) root;
302-
if (ProtoParserDefinition.rule(ProtoParser.RULE_fileReference).equals(type)) {
303-
return ((ProtoParser) parser).fileReference();
304-
}
365+
String ruleName = ruleNames[type.getRuleIndex()];
366+
return parserRule(protoParser, ruleName);
305367
}
306-
// let's hope it's an ID as needed by "rename function"
307-
throw new UnsupportedOperationException();
308-
// return ((ProtoParser) parser).name();
368+
throw new UnsupportedOperationException(String.valueOf(root.getIndex()));
309369
}
310370
};
311371
}
312372

373+
@NotNull
374+
private ParseTree parserRule(ProtoParser protoParser, String ruleName) {
375+
try {
376+
Method method = parserRuleMethods.get(ruleName);
377+
if (method == null) {
378+
throw new IllegalStateException("Not a parser rule: " + ruleName);
379+
}
380+
return (ParseTree) method.invoke(protoParser);
381+
} catch (Exception e) {
382+
throw new IllegalStateException("Exception in parser rule: " + ruleName, e);
383+
}
384+
}
385+
313386
@Override
314387
public IFileElementType getFileNodeType() {
315388
return FILE;

src/main/java/io/protostuff/jetbrains/plugin/annotator/ProtoErrorsAnnotator.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.protostuff.jetbrains.plugin.psi.GroupNode;
2020
import io.protostuff.jetbrains.plugin.psi.MessageField;
2121
import io.protostuff.jetbrains.plugin.psi.MessageNode;
22+
import io.protostuff.jetbrains.plugin.psi.OneOfNode;
2223
import io.protostuff.jetbrains.plugin.psi.OptionNode;
2324
import io.protostuff.jetbrains.plugin.psi.ProtoRootNode;
2425
import io.protostuff.jetbrains.plugin.psi.RangeNode;
@@ -140,15 +141,27 @@ private void checkDefaultValue(@NotNull OptionNode option, Syntax syntax) {
140141

141142

142143
private void checkFieldLabel(FieldNode field, Syntax syntax) {
143-
switch (syntax) {
144-
case PROTO2:
145-
checkFieldLabelProto2(field);
146-
break;
147-
case PROTO3:
148-
checkFieldLabelProto3(field);
149-
break;
150-
default:
151-
throw new IllegalStateException(String.valueOf(syntax));
144+
if (field.getParent() instanceof OneOfNode) {
145+
checkOneofFieldLabel(field);
146+
} else {
147+
switch (syntax) {
148+
case PROTO2:
149+
checkFieldLabelProto2(field);
150+
break;
151+
case PROTO3:
152+
checkFieldLabelProto3(field);
153+
break;
154+
default:
155+
throw new IllegalStateException(String.valueOf(syntax));
156+
}
157+
}
158+
}
159+
160+
private void checkOneofFieldLabel(FieldNode field) {
161+
ASTNode fieldLabelNode = field.getFieldLabelNode();
162+
if (fieldLabelNode != null) {
163+
String message = message("error.illegal.oneof.field.label");
164+
markError(field.getFieldLabelNode(), null, message);
152165
}
153166
}
154167

src/main/java/io/protostuff/jetbrains/plugin/formatter/BlockFactory.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import static io.protostuff.compiler.parser.ProtoParser.RULE_messageBlock;
2727
import static io.protostuff.compiler.parser.ProtoParser.RULE_messageName;
2828
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneof;
29-
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneofField;
30-
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneofGroup;
3129
import static io.protostuff.compiler.parser.ProtoParser.RULE_oneofName;
3230
import static io.protostuff.compiler.parser.ProtoParser.RULE_option;
3331
import static io.protostuff.compiler.parser.ProtoParser.RULE_optionEntry;
@@ -119,8 +117,6 @@ class BlockFactory {
119117
register(rule(RULE_extendBlock), ParentBlock::new);
120118
register(rule(RULE_extendBlockEntry), StatementBlock::new);
121119
register(rule(RULE_oneof), ParentBlock::new);
122-
register(rule(RULE_oneofField), StatementBlock::new);
123-
register(rule(RULE_oneofGroup), ParentBlock::new);
124120
register(rule(RULE_groupBlock), ParentBlock::new);
125121
register(rule(RULE_extensions), StatementBlock::new);
126122

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.protostuff.jetbrains.plugin.psi;
2+
3+
import com.intellij.lang.ASTNode;
4+
import com.intellij.psi.PsiElement;
5+
import com.intellij.psi.PsiNameIdentifierOwner;
6+
import com.intellij.util.IncorrectOperationException;
7+
import org.antlr.jetbrains.adapter.psi.AntlrPsiNode;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
/**
12+
* Base class for named nodes - messages, enums, fields, etc.
13+
*
14+
* @author Kostiantyn Shchepanovskyi
15+
*/
16+
public abstract class AbstractNamedNode extends AntlrPsiNode implements PsiNameIdentifierOwner {
17+
18+
19+
public AbstractNamedNode(@NotNull ASTNode node) {
20+
super(node);
21+
}
22+
23+
@Nullable
24+
@Override
25+
public GenericNameNode getNameIdentifier() {
26+
return findChildByClass(GenericNameNode.class);
27+
}
28+
29+
@Override
30+
public int getTextOffset() {
31+
PsiElement id = getNameIdentifier();
32+
return id != null ? id.getTextOffset() : super.getTextOffset();
33+
}
34+
35+
@Override
36+
public String getName() {
37+
GenericNameNode nameIdentifier = getNameIdentifier();
38+
if (nameIdentifier == null) {
39+
return null;
40+
}
41+
return nameIdentifier.getName();
42+
}
43+
44+
@Override
45+
public PsiElement setName(@NotNull String name) throws IncorrectOperationException {
46+
return GenericNameNode.setName(this, name);
47+
}
48+
}

src/main/java/io/protostuff/jetbrains/plugin/psi/DataType.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
import com.intellij.lang.ASTNode;
44
import com.intellij.psi.PsiElement;
55
import com.intellij.psi.PsiNamedElement;
6-
import com.intellij.psi.tree.IElementType;
76
import com.intellij.util.IncorrectOperationException;
8-
import org.antlr.jetbrains.adapter.psi.IdentifierDefSubtree;
97
import org.antlr.jetbrains.adapter.psi.ScopeNode;
108
import org.jetbrains.annotations.NotNull;
119
import org.jetbrains.annotations.Nullable;
@@ -16,11 +14,11 @@
1614
* @author Kostiantyn Shchepanovskyi
1715
*/
1816
public class DataType
19-
extends IdentifierDefSubtree
17+
extends AbstractNamedNode
2018
implements ScopeNode, KeywordsContainer, ProtoType {
2119

22-
public DataType(@NotNull ASTNode node, IElementType idElementType) {
23-
super(node, idElementType);
20+
public DataType(@NotNull ASTNode node) {
21+
super(node);
2422
}
2523

2624
/**

0 commit comments

Comments
 (0)