Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ intellij {
// plugins 'properties'
downloadSources = false
publish {
username = project.hasProperty('jetbrainsUser') \
? project.property('jetbrainsUser') \
: System.getenv('JETBRAINS_USER')
password = project.hasProperty('jetbrainsPassword') \
? project.property('jetbrainsPassword') \
: System.getenv('JETBRAINS_PASSWORD')
username = project.hasProperty('jetbrainsUser') \
? project.property('jetbrainsUser') \
: System.getenv('JETBRAINS_USER')
password = project.hasProperty('jetbrainsPassword') \
? project.property('jetbrainsPassword') \
: System.getenv('JETBRAINS_PASSWORD')
pluginId = '8277'
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package io.protostuff.jetbrains.plugin;

import com.intellij.lang.cacheBuilder.DefaultWordsScanner;
import com.intellij.lang.cacheBuilder.WordsScanner;
import com.intellij.lang.findUsages.FindUsagesProvider;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.tree.TokenSet;
import io.protostuff.compiler.parser.ProtoLexer;
import io.protostuff.jetbrains.plugin.psi.EnumNode;
import io.protostuff.jetbrains.plugin.psi.MessageNode;
import io.protostuff.jetbrains.plugin.psi.UserType;
import org.antlr.jetbrains.adapter.lexer.PSIElementTypeFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* @author Kostiantyn Shchepanovskyi
*/
public class ProtoFindUsagesProvider implements FindUsagesProvider {

@Nullable
@Override
public WordsScanner getWordsScanner() {

return new DefaultWordsScanner(new ProtoLexerAdapter(),
ProtoParserDefinition.IDENTIFIER_TOKEN_SET,
ProtoParserDefinition.COMMENT_TOKEN_SET,
ProtoParserDefinition.LITERAL_TOKEN_SET);
}

@Override
public boolean canFindUsagesFor(@NotNull PsiElement psiElement) {
return psiElement instanceof UserType;
}

@Nullable
@Override
public String getHelpId(@NotNull PsiElement psiElement) {
return null;
}

@NotNull
@Override
public String getType(@NotNull PsiElement element) {
if (element instanceof MessageNode) {
return "message";
}
if (element instanceof EnumNode) {
return "enum";
}
return "";
}

@NotNull
@Override
public String getDescriptiveName(@NotNull PsiElement element) {
if (element instanceof UserType) {
UserType type = (UserType) element;
return type.getFullName();
}
return "";
}

@NotNull
@Override
public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
if (element instanceof UserType) {
UserType type = (UserType) element;
if (useFullName) {
return type.getFullName();
}
//noinspection ConstantConditions
return type.getName();
}
return "";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.protostuff.jetbrains.plugin;

import com.intellij.lang.Language;
import io.protostuff.compiler.parser.ProtoLexer;
import org.antlr.jetbrains.adapter.lexer.ANTLRLexerAdaptor;
import org.antlr.v4.runtime.Lexer;

/**
* @author Kostiantyn Shchepanovskyi
*/
public class ProtoLexerAdapter extends ANTLRLexerAdaptor {

public ProtoLexerAdapter() {
super(ProtoLanguage.INSTANCE, new ProtoLexer(null));
}
}
245 changes: 157 additions & 88 deletions src/main/java/io/protostuff/jetbrains/plugin/ProtoParserDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,109 +33,178 @@
*/
public class ProtoParserDefinition implements ParserDefinition {

public static final TokenIElementType ID;
public static final TokenSet KEYWORDS;
static {
PSIElementTypeFactory.defineLanguageIElementTypes(ProtoLanguage.INSTANCE,
ProtoParser.tokenNames, ProtoParser.ruleNames);
}

// tokens
private static final List<TokenIElementType> TOKEN_TYPES = PSIElementTypeFactory.getTokenIElementTypes(ProtoLanguage.INSTANCE);
private static final List<RuleIElementType> RULE_TYPES = PSIElementTypeFactory.getRuleIElementTypes(ProtoLanguage.INSTANCE);

public static final TokenIElementType LCURLY;
public static final TokenIElementType RCURLY;
public static final TokenIElementType LPAREN;
public static final TokenIElementType RPAREN;
public static final TokenIElementType LSQUARE;
public static final TokenIElementType RSQUARE;
public static final TokenIElementType LT;
public static final TokenIElementType GT;
public static final TokenIElementType ASSIGN;
public static final TokenIElementType ID = TOKEN_TYPES.get(ProtoLexer.IDENT);

// Rules
public static final IElementType R_TYPE_REFERENCE;
public static final IElementType R_NAME;
public static final IElementType R_FIELD_MODIFIER;
private static final IFileElementType FILE;
private static final TokenSet COMMENTS;
public static final TokenSet WHITESPACE;
public static final TokenSet KEYWORDS = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE,
ProtoLexer.PACKAGE,
ProtoLexer.SYNTAX,
ProtoLexer.IMPORT,
ProtoLexer.PUBLIC,
ProtoLexer.OPTION,
ProtoLexer.MESSAGE,
ProtoLexer.GROUP,
ProtoLexer.OPTIONAL,
ProtoLexer.REQUIRED,
ProtoLexer.REPEATED,
ProtoLexer.ONEOF,
ProtoLexer.EXTEND,
ProtoLexer.EXTENSIONS,
ProtoLexer.RESERVED,
ProtoLexer.TO,
ProtoLexer.MAX,
ProtoLexer.ENUM,
ProtoLexer.SERVICE,
ProtoLexer.RPC,
ProtoLexer.STREAM,
ProtoLexer.RETURNS,
ProtoLexer.MAP,
ProtoLexer.BOOLEAN_VALUE,
ProtoLexer.DOUBLE,
ProtoLexer.FLOAT,
ProtoLexer.INT32,
ProtoLexer.INT64,
ProtoLexer.UINT32,
ProtoLexer.UINT64,
ProtoLexer.SINT32,
ProtoLexer.SINT64,
ProtoLexer.FIXED32,
ProtoLexer.FIXED64,
ProtoLexer.SFIXED32,
ProtoLexer.SFIXED64,
ProtoLexer.BOOL,
ProtoLexer.STRING,
ProtoLexer.BYTES
);

private static final TokenSet STRING;
// keywords also can be identifiers
public static final TokenSet IDENTIFIER_TOKEN_SET = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE,
ProtoLexer.IDENT,
ProtoLexer.PACKAGE,
ProtoLexer.SYNTAX,
ProtoLexer.IMPORT,
ProtoLexer.PUBLIC,
ProtoLexer.OPTION,
ProtoLexer.MESSAGE,
ProtoLexer.GROUP,
ProtoLexer.OPTIONAL,
ProtoLexer.REQUIRED,
ProtoLexer.REPEATED,
ProtoLexer.ONEOF,
ProtoLexer.EXTEND,
ProtoLexer.EXTENSIONS,
ProtoLexer.RESERVED,
ProtoLexer.TO,
ProtoLexer.MAX,
ProtoLexer.ENUM,
ProtoLexer.SERVICE,
ProtoLexer.RPC,
ProtoLexer.STREAM,
ProtoLexer.RETURNS,
ProtoLexer.MAP,
ProtoLexer.BOOLEAN_VALUE,
ProtoLexer.DOUBLE,
ProtoLexer.FLOAT,
ProtoLexer.INT32,
ProtoLexer.INT64,
ProtoLexer.UINT32,
ProtoLexer.UINT64,
ProtoLexer.SINT32,
ProtoLexer.SINT64,
ProtoLexer.FIXED32,
ProtoLexer.FIXED64,
ProtoLexer.SFIXED32,
ProtoLexer.SFIXED64,
ProtoLexer.BOOL,
ProtoLexer.STRING,
ProtoLexer.BYTES
);

private static List<TokenIElementType> tokenTypes;
private static List<RuleIElementType> ruleTypes;

static {
PSIElementTypeFactory.defineLanguageIElementTypes(ProtoLanguage.INSTANCE,
ProtoParser.tokenNames, ProtoParser.ruleNames);
tokenTypes = PSIElementTypeFactory.getTokenIElementTypes(ProtoLanguage.INSTANCE);
ID = tokenTypes.get(ProtoLexer.IDENT);
FILE = new IFileElementType(ProtoLanguage.INSTANCE);
COMMENTS = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, COMMENT, LINE_COMMENT);
WHITESPACE = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, WS, NL);
STRING = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, STRING_VALUE);
public static final TokenSet COMMENT_TOKEN_SET = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE,
ProtoLexer.COMMENT,
ProtoLexer.LINE_COMMENT
);

public static final TokenSet LITERAL_TOKEN_SET = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE,
ProtoLexer.STRING_VALUE,
ProtoLexer.FLOAT_VALUE,
ProtoLexer.INTEGER_VALUE,
ProtoLexer.IDENT,
ProtoLexer.PACKAGE,
ProtoLexer.SYNTAX,
ProtoLexer.IMPORT,
ProtoLexer.PUBLIC,
ProtoLexer.OPTION,
ProtoLexer.MESSAGE,
ProtoLexer.GROUP,
ProtoLexer.OPTIONAL,
ProtoLexer.REQUIRED,
ProtoLexer.REPEATED,
ProtoLexer.ONEOF,
ProtoLexer.EXTEND,
ProtoLexer.EXTENSIONS,
ProtoLexer.RESERVED,
ProtoLexer.TO,
ProtoLexer.MAX,
ProtoLexer.ENUM,
ProtoLexer.SERVICE,
ProtoLexer.RPC,
ProtoLexer.STREAM,
ProtoLexer.RETURNS,
ProtoLexer.MAP,
ProtoLexer.BOOLEAN_VALUE,
ProtoLexer.DOUBLE,
ProtoLexer.FLOAT,
ProtoLexer.INT32,
ProtoLexer.INT64,
ProtoLexer.UINT32,
ProtoLexer.UINT64,
ProtoLexer.SINT32,
ProtoLexer.SINT64,
ProtoLexer.FIXED32,
ProtoLexer.FIXED64,
ProtoLexer.SFIXED32,
ProtoLexer.SFIXED64,
ProtoLexer.BOOL,
ProtoLexer.STRING,
ProtoLexer.BYTES
);

KEYWORDS = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE,
ProtoLexer.PACKAGE,
ProtoLexer.SYNTAX,
ProtoLexer.IMPORT,
ProtoLexer.PUBLIC,
ProtoLexer.OPTION,
ProtoLexer.MESSAGE,
ProtoLexer.GROUP,
ProtoLexer.OPTIONAL,
ProtoLexer.REQUIRED,
ProtoLexer.REPEATED,
ProtoLexer.ONEOF,
ProtoLexer.EXTEND,
ProtoLexer.EXTENSIONS,
ProtoLexer.RESERVED,
ProtoLexer.TO,
ProtoLexer.MAX,
ProtoLexer.ENUM,
ProtoLexer.SERVICE,
ProtoLexer.RPC,
ProtoLexer.STREAM,
ProtoLexer.RETURNS,
ProtoLexer.MAP,
ProtoLexer.BOOLEAN_VALUE,
ProtoLexer.DOUBLE,
ProtoLexer.FLOAT,
ProtoLexer.INT32,
ProtoLexer.INT64,
ProtoLexer.UINT32,
ProtoLexer.UINT64,
ProtoLexer.SINT32,
ProtoLexer.SINT64,
ProtoLexer.FIXED32,
ProtoLexer.FIXED64,
ProtoLexer.SFIXED32,
ProtoLexer.SFIXED64,
ProtoLexer.BOOL,
ProtoLexer.STRING,
ProtoLexer.BYTES
);
// tokens

ruleTypes = PSIElementTypeFactory.getRuleIElementTypes(ProtoLanguage.INSTANCE);
public static final TokenIElementType LCURLY = TOKEN_TYPES.get(ProtoLexer.LCURLY);
public static final TokenIElementType RCURLY = TOKEN_TYPES.get(ProtoLexer.RCURLY);
public static final TokenIElementType LPAREN = TOKEN_TYPES.get(ProtoLexer.LPAREN);
public static final TokenIElementType RPAREN = TOKEN_TYPES.get(ProtoLexer.RPAREN);
public static final TokenIElementType LSQUARE = TOKEN_TYPES.get(ProtoLexer.LSQUARE);
public static final TokenIElementType RSQUARE = TOKEN_TYPES.get(ProtoLexer.RSQUARE);
public static final TokenIElementType LT = TOKEN_TYPES.get(ProtoLexer.LT);
public static final TokenIElementType GT = TOKEN_TYPES.get(ProtoLexer.GT);
public static final TokenIElementType ASSIGN = TOKEN_TYPES.get(ProtoLexer.ASSIGN);

R_TYPE_REFERENCE = ruleTypes.get(ProtoParser.RULE_typeReference);
R_NAME = ruleTypes.get(ProtoParser.RULE_ident);
R_FIELD_MODIFIER = ruleTypes.get(ProtoParser.RULE_fieldModifier);
// Rules
public static final IElementType R_TYPE_REFERENCE = RULE_TYPES.get(ProtoParser.RULE_typeReference);
public static final IElementType R_NAME = RULE_TYPES.get(ProtoParser.RULE_ident);
public static final IElementType R_FIELD_MODIFIER = RULE_TYPES.get(ProtoParser.RULE_fieldModifier);
private static final IFileElementType FILE = new IFileElementType(ProtoLanguage.INSTANCE);
private static final TokenSet COMMENTS = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, COMMENT, LINE_COMMENT);
public static final TokenSet WHITESPACE = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, WS, NL);

LCURLY = tokenTypes.get(ProtoLexer.LCURLY);
RCURLY = tokenTypes.get(ProtoLexer.RCURLY);
LPAREN = tokenTypes.get(ProtoLexer.LPAREN);
RPAREN = tokenTypes.get(ProtoLexer.RPAREN);
LSQUARE = tokenTypes.get(ProtoLexer.LSQUARE);
RSQUARE = tokenTypes.get(ProtoLexer.RSQUARE);
ASSIGN = tokenTypes.get(ProtoLexer.ASSIGN);
LT = tokenTypes.get(ProtoLexer.LT);
GT = tokenTypes.get(ProtoLexer.GT);
}
private static final TokenSet STRING = PSIElementTypeFactory.createTokenSet(ProtoLanguage.INSTANCE, STRING_VALUE);

public static TokenIElementType token(int token) {
return tokenTypes.get(token);
return TOKEN_TYPES.get(token);
}

public static RuleIElementType rule(int rule) {
return ruleTypes.get(rule);
return RULE_TYPES.get(rule);
}

@NotNull
Expand Down
Loading