blob: f8e2e611a5a1ecd0fc1d99581cbad8ffb28d6c9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.rdt.ui.subsystems;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.parser.ParserMessages;
import org.eclipse.cdt.utils.EFSExtensionManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.dstore.core.model.DE;
import org.eclipse.dstore.core.model.DataElement;
import org.eclipse.dstore.core.model.DataStore;
import org.eclipse.dstore.core.model.DataStoreResources;
import org.eclipse.dstore.core.model.DataStoreSchema;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider;
import org.eclipse.ptp.internal.rdt.core.RemoteProjectResourcesUtil;
import org.eclipse.ptp.internal.rdt.core.Serializer;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.CalledByResult;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.CallsToResult;
import org.eclipse.ptp.internal.rdt.core.contentassist.Proposal;
import org.eclipse.ptp.internal.rdt.core.contentassist.RemoteContentAssistInvocationContext;
import org.eclipse.ptp.internal.rdt.core.formatter.RemoteDefaultCodeFormatterOptions;
import org.eclipse.ptp.internal.rdt.core.formatter.RemoteMultiTextEdit;
import org.eclipse.ptp.internal.rdt.core.formatter.RemoteReplaceEdit;
import org.eclipse.ptp.internal.rdt.core.formatter.RemoteTextEdit;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIndexIncludeValue;
import org.eclipse.ptp.internal.rdt.core.index.IRemoteFastIndexerUpdateEvent;
import org.eclipse.ptp.internal.rdt.core.index.IRemoteFastIndexerUpdateEvent.EventType;
import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerProgress;
import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerTask;
import org.eclipse.ptp.internal.rdt.core.miners.CDTMiner;
import org.eclipse.ptp.internal.rdt.core.model.Scope;
import org.eclipse.ptp.internal.rdt.core.navigation.FoldingRegionsResult;
import org.eclipse.ptp.internal.rdt.core.navigation.OpenDeclarationResult;
import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchMatch;
import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchQuery;
import org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem;
import org.eclipse.ptp.internal.rdt.core.typehierarchy.THGraph;
import org.eclipse.ptp.rdt.core.RDTLog;
import org.eclipse.ptp.rdt.core.resources.RemoteNature;
import org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider;
import org.eclipse.ptp.rdt.ui.UIPlugin;
import org.eclipse.ptp.rdt.ui.messages.Messages;
import org.eclipse.ptp.rdt.ui.preferences.PreferenceConstants;
import org.eclipse.ptp.rdt.ui.serviceproviders.RSECIndexServiceProvider;
import org.eclipse.ptp.services.core.IService;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.rse.connectorservice.dstore.DStoreConnectorService;
import org.eclipse.rse.connectorservice.dstore.util.StatusMonitor;
import org.eclipse.rse.connectorservice.dstore.util.StatusMonitorFactory;
import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.subsystems.IConnectorService;
import org.eclipse.rse.core.subsystems.SubSystem;
import org.eclipse.rse.services.clientserver.messages.CommonMessages;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.services.dstore.util.DStoreStatusMonitor;
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.text.edits.TextEdit;
import com.ibm.icu.text.MessageFormat;
/**
* An RSE subsystem which is used to provide C/C++ indexing services from a Miner
* running on a remote host.
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the RDT team.
*
* @author crecoskie
* @since 2.0
*
*/
public class RSECIndexSubsystem extends SubSystem implements ICIndexSubsystem {
private Map<IProject, String> fInitializedProjects = new HashMap<IProject, String>();
private ProjectChangeListener fProjectOpenListener;
/**
* @since 4.0
*/
protected List<String> fErrorMessages = new ArrayList<String>();
/**
* @since 4.0
*/
protected boolean fIsInitializing = false;
/**
* @since 4.0
*/
protected String miner_class;
protected RSECIndexSubsystem(IHost host,
IConnectorService connectorService) {
super(host, connectorService);
generateErrorMessages();
setHidden(true);
}
private void generateErrorMessages() {
// fErrorMessages.add(ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.inclusionNotFound", "")); //$NON-NLS-1$ //$NON-NLS-2$
// fErrorMessages.add(ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.definitionNotFound", "")); //$NON-NLS-1$ //$NON-NLS-2$
fErrorMessages.add("Unresolved inclusion:"); //$NON-NLS-1$
fErrorMessages.add("Macro definition not found:"); //$NON-NLS-1$
}
// index management
/**
* @since 4.0
*/
protected void initializeMinerClass(){
miner_class = CDTMiner.CLASSNAME;
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public synchronized void initializeSubSystem(IProgressMonitor monitor) throws SystemMessageException {
boolean isFirstCall = false;
if(!fIsInitializing) {
fIsInitializing = true;
isFirstCall = true;
}
try {
super.initializeSubSystem(monitor);
initializeMinerClass();
fProjectOpenListener = new ProjectChangeListener(this);
ResourcesPlugin.getWorkspace().addResourceChangeListener(fProjectOpenListener);
DataStore dataStore = getDataStore(monitor);
DataElement status = dataStore.activateMiner(miner_class);
if (status != null) {
DStoreStatusMonitor statusMonitor = new DStoreStatusMonitor(dataStore);
// wait for the miner to be fully initialized
try {
statusMonitor.waitForUpdate(status, monitor);
} catch (InterruptedException e) {
UIPlugin.log(e);
}
if(status.getValue().equals("failed")){ //$NON-NLS-1$
//the initialization is failed, try to initialize the default miner
status = dataStore.activateMiner(CDTMiner.CLASSNAME);
if (status != null) {
// wait for the miner to be fully initialized
try {
statusMonitor.waitForUpdate(status, monitor);
} catch (InterruptedException e) {
UIPlugin.log(e);
}
}
}
}
}
finally {
if(isFirstCall)
fIsInitializing = false;
}
}
@Override
public synchronized void uninitializeSubSystem(IProgressMonitor monitor) {
super.uninitializeSubSystem(monitor);
ResourcesPlugin.getWorkspace().removeResourceChangeListener(fProjectOpenListener);
//fInitializedProjects = null;
fInitializedProjects.clear();
}
/*
* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#reindexScope(org.eclipse.ptp.internal.rdt.core.model.Scope, org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerTask)
*/
public IStatus reindexScope(Scope scope, IRemoteIndexerInfoProvider provider, String indexLocation, IProgressMonitor monitor, RemoteIndexerTask task) {
removeProblems(scope);
DataStore dataStore = getDataStore(monitor);
if(dataStore == null)
return Status.OK_STATUS;
DataElement result = getDataStore(monitor).createObject(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR, "index"); //$NON-NLS-1$
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
monitor.beginTask("Rebuilding indexing...", 100); //$NON-NLS-1$
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_INDEX_REINDEX);
if (queryCmd != null) {
ArrayList<Object> args = new ArrayList<Object>();
args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath()));
args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_CONFIG_LOCATION, indexLocation));
String serializedProvider = null;
try {
serializedProvider = Serializer.serialize(provider);
} catch (IOException e) {
RDTLog.logError(e);
}
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_SCANNER_INFO_PROVIDER, serializedProvider));
DataElement status = dataStore.command(queryCmd, args, result);
//poll for progress information until the operation is done or canceled
while (!status.getName().equals("done") && !status.getName().equals("cancelled") && !monitor.isCanceled() && !smonitor.isNetworkDown()) { //$NON-NLS-1$ //$NON-NLS-2$
RemoteIndexerProgress progress = getIndexerProgress(status);
task.updateProgressInformation(progress);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
RDTLog.logError(e);
}
}
if (smonitor.isNetworkDown()) {
cancelOperation(status.getParent());
String info = NLS.bind(CommonMessages.MSG_CONNECT_UNKNOWNHOST, getConnectorService().getHost().getAliasName());
String wholeMessage = MessageFormat.format(Messages.getString("RSECIndexSubsystem.12"), new Object[] {info}); //$NON-NLS-1$
RDTLog.logError(wholeMessage);
}
try {
try {
smonitor.waitForUpdate(status, monitor);
} catch (InterruptedException e) { // Canceled
if (monitor.isCanceled())
cancelOperation(status.getParent());
}
} catch (Exception e) {
RDTLog.logError(e);
}
if (status.getName().equals("done") || status.getName().equals("cancelled") || monitor.isCanceled() || smonitor.isNetworkDown()) { //$NON-NLS-1$//$NON-NLS-2$
int maxErrors = UIPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.INDEXER_ERRORS_DISPLAY_LIMIT);
int errorsReported = 0;
for (int i = 0; i < status.getNestedSize(); i ++ ){
if (errorsReported >= maxErrors)
break;
DataElement element = status.get(i);
if (element != null && CDTMiner.T_INDEXING_ERROR.equals(element.getType())) { // Error occurred on the server
String message = element.getAttribute(DE.A_NAME)+ ". " ; //$NON-NLS-1$
for (int j = 0; j < fErrorMessages.size(); j++) {
if (message.indexOf(fErrorMessages.get(j)) > 0) {
String msg = reportProblem(scope, message);
errorsReported++;
RDTLog.logWarning(msg);
}
}
}
}
}
monitor.done();
}
return Status.OK_STATUS;
}
protected void cancelOperation(DataElement command) {
// send cancel command
DataStore dataStore = command.getDataStore();
DataElement cmdDescriptor = command.getDescriptor();
DataElement cancelDescriptor = dataStore.localDescriptorQuery(cmdDescriptor, DataStoreSchema.C_CANCEL);
if (cancelDescriptor != null) {
dataStore.command(cancelDescriptor, command);
}
}
protected void removeProblems(Scope scope) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot workspaceRoot = workspace.getRoot();
IProject project = workspaceRoot.getProject(scope.getName());
try {
project.deleteMarkers("org.eclipse.ptp.rdt.ui.indexerproblemmarker", true, IResource.DEPTH_INFINITE); //$NON-NLS-1$
} catch (CoreException e) {
RDTLog.logError(e);
}
}
protected String reportProblem(Scope scope, String message) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot workspaceRoot = workspace.getRoot();
final IProject project = workspaceRoot.getProject(scope.getName());
//parser for error message
int errorMessageStart = message.indexOf("Indexer: "); //$NON-NLS-1$
int errorMessageEnd = message.indexOf(": ",errorMessageStart + 9); //$NON-NLS-1$
String errorMessage = message.substring(errorMessageStart + 9, errorMessageEnd);
boolean includeError = true;
if (errorMessage.indexOf("inclusion") < 0) //$NON-NLS-1$
includeError = false;
//parser for include/macro name
int includeStart = errorMessageEnd + 2;
int includeEnd = message.indexOf(" in file: ",includeStart); //$NON-NLS-1$
String include = message.substring(includeStart, includeEnd);
//parse for file name and line number
int fileStart = includeEnd+10;
int fileEnd = message.indexOf(":", fileStart); //$NON-NLS-1$
String fileName = message.substring(fileStart, fileEnd);
int lineStart = fileEnd;
int lineEnd = message.indexOf(". ", lineStart); //$NON-NLS-1$
final String lineNumber = message.substring(lineStart + 1, lineEnd);
//put error message back together
Object[] args = new Object[] { include, fileName, new Integer(lineNumber.replace(",", "")) }; //$NON-NLS-1$ //$NON-NLS-2$
String info = ParserMessages.getFormattedString("BaseProblemFactory.problemPattern", args); //$NON-NLS-1$
if (includeError)
info = ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.inclusionNotFound", info); //$NON-NLS-1$
else
info = ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.definitionNotFound", info); //$NON-NLS-1$
String infoMsg = Messages.getString("RSECIndexSubsystem.11"); //$NON-NLS-1$
final String wholeMessage = MessageFormat.format(Messages.getString("RSECIndexSubsystem.12"), new Object[] {info}) + " " + infoMsg; //$NON-NLS-1$ //$NON-NLS-2$
final IFile file;
String projectLocation = project.getLocationURI().getPath();
fileStart = fileName.indexOf(projectLocation);
if(fileStart == -1) {
fileName = null;
file = null;
}
else {
fileName = fileName.substring(fileStart + projectLocation.length() + 1);
IPath path = new Path(fileName);
file = project.getFile(path);
}
//file could be not exist, since the way of checking if the header file is under the project(by indexof) may give an incorrect result,
//for example, project dir is "/home/jwsliu/defects/6721" and header file name is
//"/home/jwsliu/defects/6721_header/header.h", then header file will be parsed as
//"header/header.h" under the project location, but it could be not exist. So we have to check if the file is existed or not.
if (file != null && file.exists()) {
Job job = new Job("createMarker") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
IMarker marker = file.createMarker("org.eclipse.ptp.rdt.ui.indexerproblemmarker"); //$NON-NLS-1$
marker.setAttribute(IMarker.LINE_NUMBER, Integer.parseInt(lineNumber.replace(",", ""))); //$NON-NLS-1$ //$NON-NLS-2$
marker.setAttribute(IMarker.MESSAGE, wholeMessage);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
} catch (CoreException e) {
RDTLog.logError(e);
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
} else {
Job job = new Job("createMarker") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
IMarker marker = project.createMarker("org.eclipse.ptp.rdt.ui.indexerproblemmarker"); //$NON-NLS-1$
marker.setAttribute(IMarker.MESSAGE, wholeMessage);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
} catch (CoreException e) {
RDTLog.logError(e);
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
return wholeMessage;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#indexDelta(org.eclipse.ptp.internal.rdt.core.model.Scope, java.util.List, java.util.List, java.util.List, org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus indexDelta(Scope scope, IRemoteIndexerInfoProvider provider, List<ICElement> newElements,
List<ICElement> changedElements, List<ICElement> deletedElements, IProgressMonitor monitor, RemoteIndexerTask task) {
removeProblems(scope);
DataStore dataStore = getDataStore(monitor);
if(dataStore == null)
return Status.OK_STATUS;
DataElement result = getDataStore(monitor).createObject(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR, "index"); //$NON-NLS-1$
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(_connectorService, dataStore);
int workCount = newElements.size() + changedElements.size();
monitor.beginTask("Incrementally Indexing...", workCount); //$NON-NLS-1$
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_INDEX_DELTA);
if (queryCmd != null) {
ArrayList<Object> args = new ArrayList<Object>();
args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath()));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getHost()));
String serializedProvider = null;
try {
serializedProvider = Serializer.serialize(provider);
} catch (IOException e) {
RDTLog.logError(e);
}
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_SCANNER_INFO_PROVIDER, serializedProvider));
for(ICElement element : newElements) {
String remotePath = convertURIToRemotePath(element.getLocationURI());
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_ADDED, remotePath));
}
for(ICElement element : changedElements) {
String remotePath = convertURIToRemotePath(element.getLocationURI());
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_CHANGED, remotePath));
}
for(ICElement element : deletedElements) {
String remotePath = convertURIToRemotePath(element.getLocationURI());
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_REMOVED, remotePath));
}
DataElement status = dataStore.command(queryCmd, args, result);
//poll for progress information until the operation is done or canceled
while (!status.getName().equals("done") && !status.getName().equals("cancelled") && !monitor.isCanceled() && !smonitor.isNetworkDown()) { //$NON-NLS-1$ //$NON-NLS-2$
RemoteIndexerProgress progress = getIndexerProgress(status);
task.updateProgressInformation(progress);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
RDTLog.logError(e);
}
}
if (smonitor.isNetworkDown()) {
cancelOperation(status.getParent());
String info = NLS.bind(CommonMessages.MSG_CONNECT_UNKNOWNHOST, getConnectorService().getHost().getAliasName());
String wholeMessage = MessageFormat.format(Messages.getString("RSECIndexSubsystem.12"), new Object[] {info}); //$NON-NLS-1$
RDTLog.logError(wholeMessage);
}
try {
try {
smonitor.waitForUpdate(status, monitor);
} catch (InterruptedException e) { // Canceled
if (monitor.isCanceled())
cancelOperation(status.getParent());
}
} catch(Exception e) {
RDTLog.logError(e);
}
if (status.getName().equals("done") || status.getName().equals("cancelled") || monitor.isCanceled() || smonitor.isNetworkDown()) { //$NON-NLS-1$//$NON-NLS-2$
int maxErrors = UIPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.INDEXER_ERRORS_DISPLAY_LIMIT);
int errorsReported = 0;
for (int i = 0; i < status.getNestedSize(); i ++ ){
if (errorsReported >= maxErrors)
break;
DataElement element = status.get(i);
if (element != null && CDTMiner.T_INDEXING_ERROR.equals(element.getType())) { // Error occurred on the server
String message = element.getAttribute(DE.A_NAME)+ ". " ; //$NON-NLS-1$
for (int j = 0; j < fErrorMessages.size(); j++) {
if (message.indexOf(fErrorMessages.get(j)) > 0) {
String msg = reportProblem(scope, message);
errorsReported++;
RDTLog.logWarning(msg);
}
}
}
}
}
monitor.done();
}
return Status.OK_STATUS;
}
/**
* @since 4.0
*/
protected RemoteIndexerProgress getIndexerProgress(DataElement status) {
int num = status.getNestedSize();
if (num > 0) {
boolean foundProgressInfo = false;
int counter = 1;
DataElement element = null;
while (!foundProgressInfo && counter <= num){
element = status.get(num-counter);
if(element != null && CDTMiner.T_INDEXER_PROGRESS_INFO.equals(element.getType())) {
foundProgressInfo = true;
}
counter++;
}
if(element != null && CDTMiner.T_INDEXER_PROGRESS_INFO.equals(element.getType())) {
String data = element.getName();
try
{
Object result = Serializer.deserialize(data);
if (result == null || !(result instanceof RemoteIndexerProgress))
{
return null;
}
RemoteIndexerProgress info = (RemoteIndexerProgress) result;
return info;
} catch (IOException e) {
RDTLog.logError(e);
} catch (ClassNotFoundException e) {
RDTLog.logError(e);
}
}
}
return null;
}
// scope management
/* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#registerScope(org.eclipse.ptp.internal.rdt.core.model.Scope, java.lang.String[], org.eclipse.core.runtime.IProgressMonitor)
*/
public synchronized IStatus registerScope(Scope scope, List<ICElement> elements, String configLocation, IProgressMonitor monitor)
{
DataStore dataStore = getDataStore(monitor);
if (dataStore != null)
{
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
monitor.beginTask(Messages.getString("RSECIndexSubsystem.3"), 100); //$NON-NLS-1$
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_SCOPE_REGISTER);
if (queryCmd != null)
{
ArrayList<Object> args = new ArrayList<Object>();
// need to know the scope
DataElement scopeElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
args.add(scopeElement);
// scheme for scope
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme());
args.add(dataElement);
// host
DataElement hostElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getHost());
args.add(hostElement);
// root path for scope on server
DataElement rootPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath());
args.add(rootPath);
// mapped path for scope on local machine
DataElement mappedPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath());
args.add(mappedPath);
// need to know where to find the pdom file for the scope
DataElement configElement = dataStore.createObject(null, CDTMiner.T_SCOPE_CONFIG_LOCATION, configLocation);
args.add(configElement);
// add in the filenames
for(ICElement element : elements) {
addElement(dataStore, args, element);
}
// execute the command
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try {
smonitor.waitForUpdate(status, monitor);
}
catch (Exception e) {
RDTLog.logError(e);
}
}
}
return Status.OK_STATUS;
}
/**
* @param dataStore
* @param args
* @param filePath
* @param element
*/
protected void addElement(DataStore dataStore, ArrayList<Object> args, ICElement element) {
String filePath = null;
// if it's a translation unit, we can just add it
if(element instanceof ITranslationUnit) {
filePath = convertURIToRemotePath(element.getLocationURI());
}
else {
// if it's a container or a project, add the child elements
if(element instanceof ICContainer || element instanceof ICProject) {
try {
ICElement[] children = ((IParent) element).getChildren();
for(int k = 0; k < children.length; k++)
addElement(dataStore, args, children[k]);
} catch (CModelException e) {
RDTLog.logError(e);
}
}
}
if (filePath != null) {
DataElement fileElement = dataStore.createObject(null,
CDTMiner.T_INDEX_FILENAME_DESCRIPTOR, filePath);
args.add(fileElement);
}
}
protected String convertURIToRemotePath(URI locationURI) {
String path = EFSExtensionManager.getDefault().getPathFromURI(locationURI);
return path;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#unregisterScope(org.eclipse.ptp.internal.rdt.core.model.Scope, org.eclipse.core.runtime.IProgressMonitor)
*/
public synchronized IStatus unregisterScope(Scope scope, IProgressMonitor monitor) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(scope.getName());
fInitializedProjects.remove(project);
DataStore dataStore = getDataStore(monitor);
if (dataStore != null)
{
// DataElement result = dataStore.createObject(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR, name);
// DataElement statusDescriptor = dataStore.createObjectDescriptor(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR);
// result.setDescriptor(statusDescriptor);
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
monitor.beginTask(Messages.getString("RSECIndexSubsystem.4"), 100); //$NON-NLS-1$
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_SCOPE_UNREGISTER);
if (queryCmd != null)
{
ArrayList<Object> args = new ArrayList<Object>();
// need to know the scope
DataElement scopeElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
args.add(scopeElement);
// execute the command
//DataElement status = dataStore.command(queryCmd, dataStore.getDescriptorRoot(), true);
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try {
smonitor.waitForUpdate(status, monitor);
}
catch (Exception e) {
RDTLog.logError(e);
}
}
}
return Status.OK_STATUS;
}
public IStatus removeIndexFile(Scope scope, IProgressMonitor monitor) {
sendRequest(CDTMiner.C_REMOVE_INDEX_FILE, new Object[] {scope}, monitor);
return Status.OK_STATUS;
}
public String moveIndexFile(String scopeName, String newIndexLocation, IProgressMonitor monitor) {
String actualLocation = sendRequestStringResult(CDTMiner.C_MOVE_INDEX_FILE, new Object[] {scopeName, newIndexLocation}, monitor);
return actualLocation;
}
public OpenDeclarationResult openDeclaration(Scope scope, ITranslationUnit unit, String selectedText, int selectionStart, int selectionLength, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.9"), 100); //$NON-NLS-1$
String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
Object result = sendRequest(CDTMiner.C_NAVIGATION_OPEN_DECLARATION, new Object[] {scope, unit, path, selectedText, selectionStart, selectionLength}, monitor);
if(result == null)
return OpenDeclarationResult.failureUnexpectedError();
return (OpenDeclarationResult)result;
}
// call hierarchy
public CalledByResult getCallers(Scope scope, ICElement subject, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.5") + subject, 100); //$NON-NLS-1$
String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLERS, new Object[] { scope, getHostName(), subject, path }, monitor);
if (result == null) {
return new CalledByResult();
}
return (CalledByResult) result;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#getCallees(org.eclipse.ptp.internal.rdt.core.model.Scope, java.lang.String, java.lang.String, int, int, org.eclipse.core.runtime.IProgressMonitor)
*/
public CallsToResult getCallees(Scope scope, ICElement subject, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.6") + subject, 100); //$NON-NLS-1$
String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLS, new Object[] { scope, getHostName(), subject, path }, monitor);
if (result == null) {
return new CallsToResult();
}
return (CallsToResult) result;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#getCHDefinitions(org.eclipse.ptp.internal.rdt.core.model.Scope, java.lang.String, java.lang.String, int, int, org.eclipse.core.runtime.IProgressMonitor)
*/
public ICElement[] getCHDefinitions(Scope scope, ICElement subject, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.7") + subject, 100); //$NON-NLS-1$
String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_ELEMENT, new Object[] { scope, getHostName(), subject, path }, monitor);
if (result == null) {
return new ICElement[0];
}
return (ICElement[]) result;
}
public ICElement[] getCHDefinitions(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.7") + unit, 100); //$NON-NLS-1$
String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_WORKING_COPY, new Object[] { scope, getHostName(), unit, path, selectionStart, selectionLength }, null);
if (result == null) {
return new ICElement[0];
}
return (ICElement[]) result;
}
@SuppressWarnings("unchecked")
public List<RemoteSearchMatch> runQuery(Scope scope, RemoteSearchQuery query, IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("RSECIndexSubsystem.8") + query.getScopeDescription(), 100); //$NON-NLS-1$
Object result = sendRequest(CDTMiner.C_SEARCH_RUN_QUERY, new Object[] { scope, getHostName(), query }, monitor);
if (result == null) {
return Collections.emptyList();
}
return (List<RemoteSearchMatch>) result;
}
/**
* @since 4.1
*/
@SuppressWarnings("unchecked")
public String computeHighlightPositions(ITranslationUnit targetUnit) {
// If something goes wrong, return an empty string.
checkAllProjects(new NullProgressMonitor());
DataStore dataStore = getDataStore(null);
if (dataStore == null) {
return ""; //$NON-NLS-1$
}
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_SEMANTIC_HIGHTLIGHTING_COMPUTE_POSITIONS);
if (queryCmd == null) {
return ""; //$NON-NLS-1$
}
NullProgressMonitor monitor = new NullProgressMonitor();
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
ArrayList<Object> args = new ArrayList<Object>();
Scope scope = new Scope(targetUnit.getCProject().getProject());
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
args.add(dataElement);
args.add(createSerializableElement(dataStore, targetUnit));
// execute the command
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try {
smonitor.waitForUpdate(status, monitor);
}
catch (Exception e) {
RDTLog.logError(e);
}
DataElement element = status.get(0);
String data = element.getName();
try {
Object result = Serializer.deserialize(data);
if (result == null || !(result instanceof String)) {
return ""; //$NON-NLS-1$;
}
return (String) result;
} catch (IOException e) {
RDTLog.logError(e);
} catch (ClassNotFoundException e) {
RDTLog.logError(e);
}
return ""; //$NON-NLS-1$
}
/**
* @since 4.1
*/
public FoldingRegionsResult computeFoldingRegions(ITranslationUnit targetUnit, int docLength, boolean fPreprocessorBranchFoldingEnabled, boolean fStatementsFoldingEnabled) {
checkAllProjects(new NullProgressMonitor());
DataStore dataStore = getDataStore(null);
if (dataStore == null) {
return null;
}
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_CODE_FOLDING_COMPUTE_REGIONS);
if (queryCmd == null) {
return null;
}
NullProgressMonitor monitor = new NullProgressMonitor();
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
ArrayList<Object> args = new ArrayList<Object>();
Scope scope = new Scope(targetUnit.getCProject().getProject());
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
args.add(dataElement);
args.add(createSerializableElement(dataStore, targetUnit));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_INT_DESCRIPTOR, Integer.toString(docLength)));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_BOOLEAN_DESCRIPTOR, Boolean.toString(fPreprocessorBranchFoldingEnabled)));
args.add(dataStore.createObject(null, CDTMiner.T_INDEX_BOOLEAN_DESCRIPTOR, Boolean.toString(fStatementsFoldingEnabled)));
// execute the command
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try {
smonitor.waitForUpdate(status, monitor);
}
catch (Exception e) {
RDTLog.logError(e);
}
DataElement element = status.get(0);
String data = element.getName();
try {
Object result = Serializer.deserialize(data);
if (result == null || !(result instanceof FoldingRegionsResult)) {
return null;
}
return (FoldingRegionsResult) result;
} catch (IOException e) {
RDTLog.logError(e);
} catch (ClassNotFoundException e) {
RDTLog.logError(e);
}
return null;
}
@SuppressWarnings("unchecked")
public List<Proposal> computeCompletionProposals(Scope scope, RemoteContentAssistInvocationContext context, ITranslationUnit unit) {
checkAllProjects(new NullProgressMonitor());
String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
DataStore dataStore = getDataStore(null);
if (dataStore == null)
{
return Collections.emptyList();
}
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_CONTENT_ASSIST_COMPUTE_PROPOSALS);
if (queryCmd == null)
{
return Collections.emptyList();
}
NullProgressMonitor monitor = new NullProgressMonitor();
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
ArrayList<Object> args = new ArrayList<Object>();
// need to know the scope
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
args.add(dataElement);
// invocation context
args.add(createSerializableElement(dataStore, context));
// translation unit
args.add(createSerializableElement(dataStore, unit));
// path to translation unit
dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, path);
args.add(dataElement);
// execute the command
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try
{
smonitor.waitForUpdate(status, monitor);
}
catch (Exception e)
{
RDTLog.logError(e);
}
DataElement element = status.get(0);
String data = element.getName();
try
{
Object result = Serializer.deserialize(data);
if (result == null || !(result instanceof List))
{
return Collections.emptyList();
}
return (List<Proposal>) result;
} catch (IOException e) {
RDTLog.logError(e);
} catch (ClassNotFoundException e) {
RDTLog.logError(e);
}
return Collections.emptyList();
}
public THGraph computeTypeGraph(Scope scope, ICElement input, IProgressMonitor monitor) {
String path = EFSExtensionManager.getDefault().getPathFromURI(input.getLocationURI());
Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_COMPUTE_TYPE_GRAPH, new Object[] { scope, getHostName(), input, path }, monitor);
if (result == null) {
return new THGraph();
}
return (THGraph) result;
}
public ICElement[] findTypeHierarchyInput(Scope scope, ICElement memberInput) {
String path = EFSExtensionManager.getDefault().getPathFromURI(memberInput.getLocationURI());
Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT1, new Object[] { scope, getHostName(), memberInput, path }, null);
if (result == null) {
return new ICElement[] { null, null };
}
return (ICElement[]) result;
}
public ICElement[] findTypeHierarchyInput(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength) {
String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT2, new Object[] { scope, getHostName(), unit, path, new Integer(selectionStart), new Integer(selectionLength)}, null);
if (result == null) {
return new ICElement[] { null, null };
}
return (ICElement[]) result;
}
public Object sendRequest(String requestType, Object[] arguments, IProgressMonitor monitor) {
return sendRequest(requestType, arguments, monitor, true);
}
public String sendRequestStringResult(String requestType, Object[] arguments, IProgressMonitor monitor) {
return (String) sendRequest(requestType, arguments, monitor, false);
}
/**
* Sends a request in a set format of arguments.
*
* @param deserializeResult If true the result will be deserialized, if false it will treat the result as a raw string.
*/
private Object sendRequest(String requestType, Object[] arguments, IProgressMonitor monitor, boolean deserializeResult) {
DataStore dataStore = getDataStore(monitor);
if (dataStore == null)
return null;
DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), requestType);
if (queryCmd == null)
return null;
StatusMonitor statusMonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(), dataStore);
ArrayList<Object> args = new ArrayList<Object>();
for (Object argument : arguments) {
if (argument instanceof Scope) {
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, ((Scope) argument).getName());
args.add(dataElement);
dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, ((Scope) argument).getScheme());
args.add(dataElement);
// root path for scope on server
DataElement rootPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, ((Scope) argument).getRootPath());
args.add(rootPath);
// path mappings for scope
DataElement pathElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, ((Scope) argument).getMappedPath());
args.add(pathElement);
} else if (argument instanceof String) {
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, (String) argument);
args.add(dataElement);
} else if (argument instanceof Integer
|| argument instanceof Boolean
|| argument instanceof Character
|| argument instanceof Double
|| argument instanceof Float) {
DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, argument.toString());
args.add(dataElement);
} else {
args.add(createSerializableElement(dataStore, argument));
}
}
// execute the command
DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
try {
//monitor = monitor == null ? new NullProgressMonitor() : monitor;
StatusMonitor smonitor = StatusMonitorFactory.getInstance().getStatusMonitorFor(getConnectorService(),
dataStore);
try {
smonitor.waitForUpdate(status, monitor);
} catch (InterruptedException e) { // Canceled
if (monitor.isCanceled())
cancelOperation(status.getParent());
}
} catch (Exception e) {
RDTLog.logError(e);
}
DataElement element = status.get(0);
if (element == null) {
return null;
}
if(DataStoreResources.model_error.equals(element.getType())) { // Error occurred on the server
RDTLog.logError(status.getValue()); // prints the server error stack trace to the log
return null;
}
String data = element.getName();
if(!deserializeResult)
return data;
try
{
Object result = Serializer.deserialize(data);
return result;
} catch (IOException e) {
RDTLog.logError(e);
} catch (ClassNotFoundException e) {
RDTLog.logError(e);
}
return null;
}
private DataElement createSerializableElement(DataStore dataStore, Object object) {
try {
String serialized = Serializer.serialize(object);
return dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, serialized);
} catch (IOException e) {
RDTLog.logError(e);
return null;
}
}
protected synchronized DataStore getDataStore(IProgressMonitor monitor)
{
if(monitor == null) {
monitor = new NullProgressMonitor();
}
try {
RSECorePlugin.waitForInitCompletion();
} catch (InterruptedException e) {
UIPlugin.log(e);
return null;
}
IConnectorService connectorService = getConnectorService();
if(connectorService instanceof DStoreConnectorService) {
DStoreConnectorService dstoreConnectorService = (DStoreConnectorService) connectorService;
if(!fIsInitializing && !dstoreConnectorService.isConnected()) {
try {
dstoreConnectorService.connect(monitor);
} catch (Exception e) {
UIPlugin.log(e);
}
}
return dstoreConnectorService.getDataStore();
}
return null;
}
public synchronized void checkAllProjects(IProgressMonitor monitor) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot workspaceRoot = workspace.getRoot();
for (IProject project : workspaceRoot.getProjects()) {
// is the project open? if not, there's not much we can do
if (!project.isOpen())
continue;
// is this an RDT C/C++ project?
// check the project natures... we care about the project if it has
// both the remote nature and
// at least one of the CDT natures
try {
if (!project.hasNature(RemoteNature.REMOTE_NATURE_ID)
|| !(project.hasNature(CProjectNature.C_NATURE_ID)
|| project.hasNature(CCProjectNature.CC_NATURE_ID)))
continue;
checkProject(project, monitor);
} catch (Throwable e) {
RDTLog.logError(e);
}
}
}
public synchronized void checkProject(IProject project, IProgressMonitor monitor) {
try {
RSECorePlugin.waitForInitCompletion();
} catch (InterruptedException e) {
UIPlugin.log(e);
return;
}
IConnectorService connectorService = getConnectorService();
if(!connectorService.isConnected()) {
try {
connectorService.connect(monitor);
} catch (Exception e) {
UIPlugin.log(e);
}
}
if (project == null){
return;
}
if(fInitializedProjects.containsKey(project)){
String projectURI = project.getLocationURI().toString();
if(projectURI.equals(fInitializedProjects.get(project))){
return;
}else{
//the project's uri is changed, so we need to initialize it again.
//no need to unregister its scope, since initializeScope handles it.
}
}
try {
initializeScope(project, monitor);
} catch (CoreException e) {
RDTLog.logError(e);
}
}
private synchronized void initializeScope(IProject project, IProgressMonitor monitor) throws CoreException {
// get the service model configuration for this project
final ServiceModelManager serviceModelManager = ServiceModelManager.getInstance();
IServiceConfiguration config = serviceModelManager.getActiveConfiguration(project);
// is the indexing service associated with our service provider?
IService service = serviceModelManager.getService(RSECIndexServiceProvider.SERVICE_ID);
IServiceProvider provider = config.getServiceProvider(service);
// if so, initialize a scope for the project consisting of all
// its translation units
final List<ICElement> cElements = RemoteProjectResourcesUtil.getCElements(project);
Scope scope = new Scope(project);
String configLocation = ((IIndexServiceProvider)provider).getIndexLocation();
// unregister the scope if there already is one
unregisterScope(scope, monitor);
// register the new scope
registerScope(scope, cElements, configLocation, monitor);
String projectURI = project.getLocationURI().toString();
fInitializedProjects.put(project, projectURI);
}
public IIndexIncludeValue[] findIncludesTo(Scope scope, IIndexFileLocation location, IProgressMonitor monitor)
{
Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDES_TO, new Object[] { scope, getHostName(), location }, monitor);
if (result == null)
{
return new IIndexIncludeValue[0];
}
return (IIndexIncludeValue[]) result;
}
public IIndexIncludeValue[] findIncludedBy(Scope scope, IIndexFileLocation location, IProgressMonitor monitor)
{
Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDED_BY, new Object[] { scope, getHostName(), location }, monitor);
if (result == null)
{
return new IIndexIncludeValue[0];
}
return (IIndexIncludeValue[]) result;
}
public boolean isIndexed(Scope scope, IIndexFileLocation location, IProgressMonitor monitor)
{
Object result = sendRequest(CDTMiner.C_INCLUDES_IS_INDEXED, new Object[] { scope, getHostName(), location }, monitor);
if (result != null)
{
return Boolean.parseBoolean(result.toString());
}
return false;
}
public IIndexIncludeValue findInclude(Scope scope, IIndexFileLocation location, String name, int offset, IProgressMonitor monitor)
{
Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDE, new Object[] { scope, getHostName(), location, name, offset}, monitor);
if (result == null)
{
return null;
}
return (IIndexIncludeValue) result;
}
public ITranslationUnit getModel(ITranslationUnit unit, IProgressMonitor monitor) {
Object result = sendRequest(CDTMiner.C_MODEL_BUILDER, new Object[] {unit}, monitor);
if (result == null)
{
return null;
}
//the working copy
return (ITranslationUnit) result;
}
/**
* @since 4.0
*/
public EventType getReIndexEventType() {
return IRemoteFastIndexerUpdateEvent.EventType.EVENT_REINDEX;
}
/**
* @since 4.1
*/
public TextEdit computeCodeFormatting(Scope scope, ITranslationUnit targetUnit, String source, RemoteDefaultCodeFormatterOptions preferences, int offset, int length, IProgressMonitor monitor) {
Object result = sendRequest(CDTMiner.C_CODE_FORMATTING, new Object[] {scope.getName(), targetUnit, source, preferences, offset, length}, monitor);
if (result == null)
{
return null;
}
return transformEdit((RemoteTextEdit) result);
}
private TextEdit transformEdit(RemoteTextEdit remoteEdit) {
TextEdit edit = null;
if (remoteEdit instanceof RemoteMultiTextEdit) {
RemoteMultiTextEdit source = (RemoteMultiTextEdit) remoteEdit;
edit = new MultiTextEdit(source.getOffset(), source.getLength());
} else if (remoteEdit instanceof RemoteReplaceEdit) {
RemoteReplaceEdit source = (RemoteReplaceEdit) remoteEdit;
edit = new ReplaceEdit(source.getOffset(), source.getLength(), source.getText());
}
if (edit != null) {
RemoteTextEdit[] children = remoteEdit.getChildren();
for (int i = 0; i < children.length; i++) {
edit.addChild(transformEdit(children[i]));
}
}
return edit;
}
}