private void command_find (String argString) {
String[] args = argString.split(" ");
String targetArg = args[args.length - 1];
List<SearchResult> searchResults = null;
MessageLogger searchLogger = new MessageLogger();
long searchStart = System.currentTimeMillis();
if(args.length <= 1 || args[0].equals("all")) {
iceLogger.log(Level.INFO, "Searching workspace for all occurrences of " + targetArg + "...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findAllOccurrences(targetArg, searchLogger);
} else if(args[0].equals("ref")) {
iceLogger.log(Level.INFO, "Searching workspace for references to " + targetArg + "...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findReferences(targetArg, searchLogger);
} else if(args[0].equals("instByClass")) {
iceLogger.log(Level.INFO, "Searching workspace for instances of class " + targetArg + "...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findInstancesOfClass(targetArg, searchLogger);
} else if(args[0].equals("instByType")) {
iceLogger.log(Level.INFO, "Searching workspace for classes that type " + targetArg + " is an instance of...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findTypeInstances(targetArg, searchLogger);
} else if(args[0].equals("defn")) {
iceLogger.log(Level.INFO, "Searching workspace for definition of " + targetArg + "...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findDefinition(targetArg, searchLogger);
} else if(args[0].equals("constructions")) {
iceLogger.log(Level.INFO, "Searching workspace for constructions of " + targetArg + "...");
searchResults = workspaceManager.getWorkspace().getSourceMetrics().findConstructions(targetArg, searchLogger);
} else {
iceLogger.log(Level.INFO, "unrecognized search type '" + args[0] + "'");
}
if(searchResults != null) {
for(final SearchResult searchResult : searchResults) {
if(searchResult != null) {
if (searchResult instanceof SearchResult.Precise) {
SearchResult.Precise preciseSearchResult = (SearchResult.Precise)searchResult;
StringBuilder searchResultBuffer = new StringBuilder();
searchResultBuffer.append(preciseSearchResult.getSourceRange().getSourceName());
searchResultBuffer.append(": (line ");
searchResultBuffer.append(preciseSearchResult.getSourceRange().getStartLine());
searchResultBuffer.append(", column ");
searchResultBuffer.append(preciseSearchResult.getSourceRange().getStartColumn());
searchResultBuffer.append(") - ");
searchResultBuffer.append(preciseSearchResult.getName().toSourceText());
int pointerPos = 0;
String contextLine = preciseSearchResult.getContextLine();
String trimmedContextLine = null;
if(contextLine != null) {
trimmedContextLine = contextLine.trim();
searchResultBuffer.append(" - ");
pointerPos = searchResultBuffer.length();
searchResultBuffer.append(trimmedContextLine);
}
iceLogger.log(Level.INFO, searchResultBuffer.toString());
if(pointerPos != 0) {
StringBuilder pointerBuffer = new StringBuilder(pointerPos + 1);
for(int i = 0; i < pointerPos; i++) {
pointerBuffer.append(' ');
}
int printableStartIndex = countLeftWhitespace(contextLine);
for(int i = printableStartIndex; i < preciseSearchResult.getContextLineIndex() ; i++) {
if(contextLine.charAt(i) == '\t') {
pointerBuffer.append('\t');
} else {
pointerBuffer.append(' ');
}
}
int currentPos = pointerBuffer.length() + 1;
for(int i = preciseSearchResult.getContextLineIndex(); i < preciseSearchResult.getContextLineEndIndex(); i++) {
int width = SourcePosition.columnWidth(currentPos, contextLine.charAt(i));
for(int j = 0; j < width; j++) {
pointerBuffer.append('^');
currentPos++;
}
}
iceLogger.log(Level.INFO, pointerBuffer.toString());
}
} else if (searchResult instanceof SearchResult.Frequency) {
SearchResult.Frequency freqSearchResult = (SearchResult.Frequency)searchResult;
int frequency = freqSearchResult.getFrequency();
SearchResult.Frequency.Type resultType = freqSearchResult.getType();
String optionalS = (frequency == 1 ? "" : "s");
String resultTypeString;
if (resultType == SearchResult.Frequency.Type.FUNCTION_REFERENCES) {
resultTypeString = "reference" + optionalS + " to ";
} else if (resultType == SearchResult.Frequency.Type.INSTANCE_METHOD_REFERENCES) {
resultTypeString = "instance method" + optionalS + " referencing ";
} else if (resultType == SearchResult.Frequency.Type.CLASS_CONSTRAINTS) {
resultTypeString = "class constraint" + optionalS + " referencing ";
} else if (resultType == SearchResult.Frequency.Type.CLASSES) {
resultTypeString = "instance" + optionalS + " for the type ";
} else if (resultType == SearchResult.Frequency.Type.INSTANCES) {
resultTypeString = "instance" + optionalS + " for the class ";
} else if (resultType == SearchResult.Frequency.Type.DEFINITION) {
resultTypeString = "definition" + optionalS + " of ";
} else if (resultType == SearchResult.Frequency.Type.IMPORT) {
resultTypeString = "import statement" + optionalS + " referencing ";
} else {
throw new IllegalStateException("Unknown search result type: " + resultType);
}
String searchResultString = freqSearchResult.getModuleName() + ": " + frequency + " " + resultTypeString + freqSearchResult.getName();
iceLogger.log(Level.INFO, "(Sourceless result) " + searchResultString);
} else {
iceLogger.log(Level.INFO, "Unknown search result: " + searchResult);
}
}
}
long searchTime = System.currentTimeMillis() - searchStart;
int nHits = 0;
for (int i = 0, n = searchResults.size(); i < n; i++) {
SearchResult result = searchResults.get(i);
if (result instanceof SearchResult.Frequency) {
nHits += ((SearchResult.Frequency)result).getFrequency();
} else {
nHits++;
}
}
if(nHits == 1) {
iceLogger.log(Level.INFO, "1 hit found in " + searchTime + "ms");
} else {
iceLogger.log(Level.INFO, nHits + " hits found in " + searchTime + "ms");
}
if(searchLogger.getMaxSeverity().compareTo(CompilerMessage.Severity.ERROR) >= 0) {
iceLogger.log(Level.WARNING, "Search results may be incomplete due to errors during search:");
dumpCompilerMessages(searchLogger);
}
}
}