2014-10-30 141 views
0

向PhpStorm(或其他JetBrains IDE's)添加'意圖'時,如何檢測PsiElement是否是字符串?我將我的代碼建立在我能找到的唯一意圖示例上。我似乎無法找到適當的文件。這是據我得到:檢查PsiElement是否爲字符串

@NonNls public class SomeIntention extends PsiElementBaseIntentionAction implements IntentionAction { 

    public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable PsiElement element) { 
     if (element == null || !(element instanceof /* String? */) { 
      return false; 
     } 
    } 

} 

instanceof String顯然是行不通的,但即使使用PsiViewer我無法弄清楚如何測試它是否是一個字符串。

回答

1

下的工作檢查,如果我們當前節點是一個字符串(雙引號或單引號):

ASTNode ast_node = element.getNode(); 

if(ast_node == null) { 
    return false; 
} 

IElementType element_type = ast_node.getElementType(); 

if(element_type != PhpTokenTypes.STRING_LITERAL 
&& element_type != PhpTokenTypes.STRING_LITERAL_SINGLE_QUOTE) { 
    return false; 
} 

return true; 

就我而言,我只是想「原始字符串」,而不是與變量或級聯串。如果字符串中存在任何變量或連接符號,那麼PSI會將它們看作是獨立的兄弟。所以我可以通過排除兄弟姐妹的字符串來找到原始字符串:

// Disregards strings with variables, concatenation, etc. 
if (element.getPrevSibling() != null || element.getNextSibling() != null) { 
    return false; 
} 

return true; 
3

我會建議查看intellij社區源代碼,日誌記錄,調試和使用PsiViewer插件,然後你會發現某些類型的PsiJavaToken包含一個字符串。