use of org.eclipse.titan.designer.parsers.ProjectSourceParser in project titan.EclipsePlug-ins by eclipse.
the class DependencyCollector method readDependencies.
public WorkspaceJob readDependencies() {
final WorkspaceJob job = new WorkspaceJob("ExtractModulePar: reading dependencies from source project") {
@Override
public IStatus runInWorkspace(final IProgressMonitor monitor) throws CoreException {
final ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(sourceProj);
// find all dependencies of the 'selection' definition
Set<IResource> allFiles = new HashSet<IResource>();
Set<IResource> asnFiles = new HashSet<IResource>();
NavigableSet<ILocateableNode> dependencies = new TreeSet<ILocateableNode>(new LocationComparator());
for (Def_ModulePar def : selection) {
/*
* Def_ModulePars with mutliple entries in a single modulepar block have incorrect location info
* (all entries have a location info equal to the location of their parent block)
* that is why the dependencies must be collected into a set that is not sorted by location
*
* TODO fix grammar definitions
* */
Set<ILocateableNode> nonSortedTempSet = new HashSet<ILocateableNode>();
collectDependencies(def, nonSortedTempSet, allFiles, asnFiles);
dependencies.addAll(nonSortedTempSet);
allFiles.add(def.getLocation().getFile());
// adding the selection itself to the dependencies
if (!dependencies.contains(def)) {
dependencies.add(def);
}
// get imports and friends for all files
for (IResource r : allFiles) {
if (!(r instanceof IFile)) {
continue;
}
IFile f = (IFile) r;
Module m = projectSourceParser.containedModule(f);
ImportFinderVisitor impVisitor = new ImportFinderVisitor();
m.accept(impVisitor);
List<ImportModule> impDefs = impVisitor.getImportDefs();
List<FriendModule> friendDefs = impVisitor.getFriendDefs();
filterImportDefinitions(allFiles, impDefs, projectSourceParser);
filterFriendDefinitions(allFiles, friendDefs, projectSourceParser);
dependencies.addAll(impDefs);
dependencies.addAll(friendDefs);
// the dependencies are sorted by file & location to avoid reading through a file multiple times
}
}
// collect the text to insert into the new project
copyMap = new HashMap<IPath, StringBuilder>();
try {
InputStream is = null;
InputStreamReader isr = null;
IResource lastFile = null;
IResource currFile;
ILocateableNode lastD = null;
int currOffset = 0;
for (ILocateableNode d : dependencies) {
currFile = d.getLocation().getFile();
if (!(currFile instanceof IFile)) {
ErrorReporter.logError("ExtractModulePar/DependencyCollector: IResource `" + currFile.getName() + "' is not an IFile.");
continue;
}
if (currFile != lastFile) {
// started reading new file
lastD = null;
if (lastFile != null) {
addToCopyMap(lastFile.getProjectRelativePath(), MODULE_TRAILER);
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
is = ((IFile) currFile).getContents();
isr = new InputStreamReader(is);
currOffset = 0;
Module m = projectSourceParser.containedModule((IFile) currFile);
String moduleName = m.getIdentifier().getTtcnName();
addToCopyMap(currFile.getProjectRelativePath(), MessageFormat.format(MODULE_HEADER, moduleName));
}
int toSkip = getNodeOffset(d) - currOffset;
if (toSkip < 0) {
reportOverlappingError(lastD, d);
continue;
}
isr.skip(toSkip);
// separators
if (d instanceof ImportModule && lastD instanceof ImportModule) {
addToCopyMap(currFile.getProjectRelativePath(), SINGLE_SEPARATOR);
} else if (d instanceof FriendModule && lastD instanceof FriendModule) {
addToCopyMap(currFile.getProjectRelativePath(), SINGLE_SEPARATOR);
} else {
addToCopyMap(currFile.getProjectRelativePath(), DOUBLE_SEPARATOR);
}
//
insertDependency(d, currFile, isr);
currOffset = d.getLocation().getEndOffset();
lastFile = currFile;
lastD = d;
}
if (lastFile != null) {
addToCopyMap(lastFile.getProjectRelativePath(), MODULE_TRAILER);
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
// copy the full content of asn files without opening them
filesToCopy = new ArrayList<IFile>();
for (IResource r : asnFiles) {
if (!(r instanceof IFile)) {
ErrorReporter.logError("ExtractModulePar/DependencyCollector: IResource `" + r.getName() + "' is not an IFile.");
continue;
}
filesToCopy.add((IFile) r);
}
} catch (IOException ioe) {
ErrorReporter.logError("ExtractModulePar/DependencyCollector: Error while reading source project.");
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
private void insertDependency(final ILocateableNode d, final IResource res, final InputStreamReader isr) throws IOException {
char[] content = new char[d.getLocation().getEndOffset() - getNodeOffset(d)];
isr.read(content, 0, content.length);
addToCopyMap(res.getProjectRelativePath(), new String(content));
}
};
job.setUser(true);
job.schedule();
return job;
}
use of org.eclipse.titan.designer.parsers.ProjectSourceParser in project titan.EclipsePlug-ins by eclipse.
the class SelectionFinder method findSelection.
private Definition findSelection() {
// getting the active editor
final IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (editor == null || !(editor instanceof TTCN3Editor)) {
return null;
}
final TTCN3Editor targetEditor = (TTCN3Editor) editor;
// iterating through part of the module
final IResource selectedRes = extractResource(targetEditor);
if (!(selectedRes instanceof IFile)) {
ErrorReporter.logError("SelectionFinder.findSelection(): Selected resource `" + selectedRes.getName() + "' is not a file.");
return null;
}
final IFile selectedFile = (IFile) selectedRes;
sourceProj = selectedFile.getProject();
final ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(sourceProj);
final Module selectedModule = projectSourceParser.containedModule(selectedFile);
// getting current selection
final ISelectionService selectionService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
final TextSelection textSelection = extractSelection(selectionService.getSelection());
// getting current selection nodes
final int selectionOffset = textSelection.getOffset() + textSelection.getLength();
final SelectionFinderVisitor selVisitor = new SelectionFinderVisitor(selectionOffset);
selectedModule.accept(selVisitor);
final Definition selectedDef = selVisitor.getSelection();
if (selectedDef == null) {
ErrorReporter.logWarning("SelectionFinder.findSelection(): Visitor did not find a definition in the selection.");
final IStatusLineManager statusLineManager = targetEditor.getEditorSite().getActionBars().getStatusLineManager();
statusLineManager.setErrorMessage(ERR_MSG_NO_SELECTION);
return null;
}
return selectedDef;
}
use of org.eclipse.titan.designer.parsers.ProjectSourceParser in project titan.EclipsePlug-ins by eclipse.
the class ChangeCreator method perform.
public void perform() {
// get module in selected file
if (file == null) {
return;
}
final ProjectSourceParser sourceParser = GlobalParser.getProjectSourceParser(file.getProject());
final Module module = sourceParser.containedModule(file);
if (module == null) {
return;
}
//
if (textSelection != null) {
performOnSelectionOnly(module);
} else {
performOnWholeModule(module);
}
}
use of org.eclipse.titan.designer.parsers.ProjectSourceParser in project titan.EclipsePlug-ins by eclipse.
the class ChangeCreator method createFileChange.
private Change createFileChange(final IFile toVisit) {
if (toVisit == null) {
return null;
}
final ProjectSourceParser sourceParser = GlobalParser.getProjectSourceParser(toVisit.getProject());
final Module module = sourceParser.containedModule(toVisit);
if (module == null) {
return null;
}
// find all locations in the module that should be edited
final DefinitionVisitor vis = new DefinitionVisitor();
module.accept(vis);
final NavigableSet<ILocateableNode> nodes = vis.getLocations();
if (nodes.isEmpty()) {
return null;
}
// calculate edit locations
final List<Location> locations = new ArrayList<Location>();
try {
final WorkspaceJob job1 = calculateEditLocations(nodes, toVisit, locations);
job1.join();
} catch (InterruptedException ie) {
ErrorReporter.logExceptionStackTrace(ie);
} catch (CoreException ce) {
ErrorReporter.logError("MinimizeVisibilityRefactoring/CreateChange.createFileChange(): " + "CoreException while calculating edit locations. ");
ErrorReporter.logExceptionStackTrace(ce);
}
if (locations.isEmpty()) {
return null;
}
// create a change for each edit location
final TextFileChange tfc = new TextFileChange(toVisit.getName(), toVisit);
final MultiTextEdit rootEdit = new MultiTextEdit();
tfc.setEdit(rootEdit);
for (Location l : locations) {
final int len = l.getEndOffset() - l.getOffset();
if (len == 0) {
rootEdit.addChild(new InsertEdit(l.getOffset(), "private "));
} else {
rootEdit.addChild(new ReplaceEdit(l.getOffset(), len, "private "));
}
}
return tfc;
}
use of org.eclipse.titan.designer.parsers.ProjectSourceParser in project titan.EclipsePlug-ins by eclipse.
the class ChangeCreator method createFileChange.
private Change createFileChange(final IFile toVisit) {
if (toVisit == null) {
return null;
}
final ProjectSourceParser sourceParser = GlobalParser.getProjectSourceParser(toVisit.getProject());
final Module module = sourceParser.containedModule(toVisit);
if (module == null) {
return null;
}
// find all locations in the module that should be edited
final DefinitionVisitor vis = new DefinitionVisitor();
module.accept(vis);
final NavigableSet<Definition> nodes = vis.getLocations();
if (nodes.isEmpty()) {
return null;
}
// calculate edit locations
final List<Definition> locations = new ArrayList<Definition>();
try {
final WorkspaceJob job1 = calculateEditLocations(nodes, toVisit, locations);
job1.join();
} catch (InterruptedException ie) {
ErrorReporter.logExceptionStackTrace(ie);
} catch (CoreException ce) {
ErrorReporter.logError("UngroupModuleparRefactoring/CreateChange.createFileChange(): " + "CoreException while calculating edit locations. ");
ErrorReporter.logExceptionStackTrace(ce);
}
if (locations.isEmpty()) {
return null;
}
// create a change for each edit location
final TextFileChange tfc = new TextFileChange(toVisit.getName(), toVisit);
final MultiTextEdit rootEdit = new MultiTextEdit();
tfc.setEdit(rootEdit);
int precedeOffset = -1;
final String fileContents = loadFileContent(toVisit);
for (Definition node : locations) {
final Location l = node.getCumulativeDefinitionLocation();
final Location typeLocation = node.getType(CompilationTimeStamp.getBaseTimestamp()).getLocation();
final Location identifierLocation = node.getIdentifier().getLocation();
if (precedeOffset != l.getOffset()) {
precedeOffset = l.getOffset();
final int len = l.getEndOffset() - l.getOffset();
rootEdit.addChild(new DeleteEdit(l.getOffset(), len + 1));
}
String typeText = fileContents.substring(typeLocation.getOffset(), typeLocation.getEndOffset()).trim();
String name = fileContents.substring(identifierLocation.getOffset(), identifierLocation.getEndOffset()).trim();
String newModulePar = "";
if (node instanceof Def_ModulePar) {
Def_ModulePar modulePar = (Def_ModulePar) node;
if (modulePar.getDefaultValue() != null) {
final Location valueLocation = modulePar.getDefaultValue().getLocation();
String valueText = fileContents.substring(valueLocation.getOffset(), valueLocation.getEndOffset()).trim();
newModulePar = "modulepar " + typeText + " " + name + " := " + valueText + ";\n";
} else {
newModulePar = "modulepar " + typeText + " " + name + ";\n";
}
} else if (node instanceof Def_ModulePar_Template) {
Def_ModulePar_Template modulePar = (Def_ModulePar_Template) node;
if (modulePar.getDefaultTemplate() != null) {
final Location valueLocation = modulePar.getDefaultTemplate().getLocation();
String temlateText = fileContents.substring(valueLocation.getOffset(), valueLocation.getEndOffset()).trim();
newModulePar = "modulepar template " + typeText + " " + name + " := " + temlateText + ";\n";
} else {
newModulePar = "modulepar template " + typeText + " " + name + ";\n";
}
}
rootEdit.addChild(new InsertEdit(l.getOffset(), newModulePar));
}
return tfc;
}
Aggregations