/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.lang.psi.impl; import gw.lang.GosuShop; import gw.lang.parser.ISourceCodeTokenizer; import gw.lang.parser.Keyword; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.StringReader; public class PackageNameExtractor { @Nullable public static String getPackageNameFromSource(String text) { ISourceCodeTokenizer tokenizer = GosuShop.createSourceCodeTokenizer(new StringReader(text)); do { tokenizer.nextToken(); if (match(tokenizer, Keyword.KW_package)) { return parseDotPathWord(tokenizer); } } while (!tokenizer.isEOF()); return null; } private static String parseDotPathWord(@NotNull ISourceCodeTokenizer tokenizer) { StringBuilder sb = new StringBuilder(tokenizer.getStringValue()); if (match(tokenizer, null, ISourceCodeTokenizer.TT_WORD, false)) { while (match(tokenizer, null, '.', false)) { sb.append('.'); sb.append(tokenizer.getStringValue()); match(tokenizer, null, ISourceCodeTokenizer.TT_WORD, false); } } return sb.toString(); } private static boolean match(@NotNull ISourceCodeTokenizer tokenizer, @NotNull Keyword token) { return match(tokenizer, token, false); } private static boolean match(@NotNull ISourceCodeTokenizer tokenizer, @NotNull Keyword token, boolean bPeek) { boolean bMatch = false; if (ISourceCodeTokenizer.TT_KEYWORD == tokenizer.getType()) { bMatch = token.toString().equalsIgnoreCase(tokenizer.getStringValue()); } if (bMatch && !bPeek) { tokenizer.nextToken(); } return bMatch; } private static boolean match(@NotNull ISourceCodeTokenizer tokenizer, @Nullable String token, int iType, boolean bPeek) { boolean bMatch = false; if (token != null) { if ((iType == tokenizer.getType()) || ((iType == 0) && (tokenizer.getType() == ISourceCodeTokenizer.TT_WORD))) { bMatch = token.equalsIgnoreCase(tokenizer.getStringValue()); } } else { bMatch = (tokenizer.getType() == iType) || isValueKeyword(tokenizer, iType); } if (bMatch && !bPeek) { tokenizer.nextToken(); } return bMatch; } private static boolean isValueKeyword(@NotNull ISourceCodeTokenizer tokenizer, int iType) { return iType == ISourceCodeTokenizer.TT_WORD && tokenizer.getType() == ISourceCodeTokenizer.TT_KEYWORD && Keyword.isValueKeyword( tokenizer.getStringValue() ); } }