protected void addMsg(String msg) { if (currentUnit != null) { messages.append(currentUnit.getPath() + " "); } messages.append(msg); messages.append("\n"); }
private void runOnMultiple(final ICompilationUnit[] cus) { ICleanUp[] cleanUps = getCleanUps(cus); if (cleanUps == null) return; MultiStatus status = new MultiStatus( JavaUI.ID_PLUGIN, IStatus.OK, ActionMessages.CleanUpAction_MultiStateErrorTitle, null); for (int i = 0; i < cus.length; i++) { ICompilationUnit cu = cus[i]; if (!ActionUtil.isOnBuildPath(cu)) { String cuLocation = BasicElementLabels.getPathLabel(cu.getPath(), false); String message = Messages.format(ActionMessages.CleanUpAction_CUNotOnBuildpathMessage, cuLocation); status.add(new Status(IStatus.INFO, JavaUI.ID_PLUGIN, IStatus.ERROR, message, null)); } } if (!status.isOK()) { ErrorDialog.openError(getShell(), getActionName(), null, status); return; } try { performRefactoring(cus, cleanUps); } catch (InvocationTargetException e) { JavaPlugin.log(e); if (e.getCause() instanceof CoreException) showUnexpectedError((CoreException) e.getCause()); } }
/** * Function for traversing the source files in the application under analysis * * @param astC * @return */ public TreeSet analyzeLibraryCode(ASTCrawler astC) { IJavaProject libProject = RepositoryAnalyzer.getInstance().getCurrentJProject(); if (libProject == null) { logger.warn("No library project is available as input. Nothing can be done, Sorry!!!!"); return null; } try { IPackageFragment[] fragments = libProject.getPackageFragments(); for (int j = 0; j < fragments.length; j++) { switch (fragments[j].getKind()) { case IPackageFragmentRoot.K_SOURCE: /** * @todo I'm not sure whether K_SOURCE actually means non-Archive (and therefore further * testing is obsolete) */ IPackageFragmentRoot root = (IPackageFragmentRoot) fragments[j].getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); if (!root.isArchive()) { ICompilationUnit[] units = fragments[j].getCompilationUnits(); for (ICompilationUnit icu : units) { ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setProject(libProject); parser.setResolveBindings(true); parser.setStatementsRecovery(true); parser.setSource(icu); CompilationUnit cu_java = (CompilationUnit) parser.createAST(null); try { // This also clears the class specific data of the previous run String path = icu.getPath().toString(); int indexOfLastSlash; if ((indexOfLastSlash = path.lastIndexOf("/")) != -1) { path = path.substring(indexOfLastSlash + 1, path.length()); } astC.preProcessClass(cu_java, path); MethodInvocationHolder.MIHKEYGEN = 0; cu_java.accept(astC); } catch (Exception ex) { ex.printStackTrace(); } } } break; default: break; } } } catch (Exception ex) { ex.printStackTrace(); } return astC.postProcess(); }
protected void addErrorMsg(String msg) { errorCount++; if (currentUnit != null) { messages.append(currentUnit.getPath() + " "); } messages.append(msg); messages.append("\n"); }
@Override public synchronized IBuffer createBuffer(final ICompilationUnit workingCopy) { String path = workingCopy.getPath().toString(); if (documents.containsKey(path)) { return get(path, JavaPadDocument.class); } JavaPadDocument doc; IFile file = workingCopy.getResource() instanceof IFile ? (IFile) workingCopy.getResource() : null; try { documents.put( workingCopy.getPath().toString(), doc = new JavaPadDocument(this, collaboration.get(file), workingCopy)); } catch (IOException ioe) { ioe.printStackTrace(); // XXX throw new Error(ioe); // XXX } return doc; }
private boolean testOnBuildPath(ICompilationUnit cu, MultiStatus status) { IJavaProject project = cu.getJavaProject(); if (!project.isOnClasspath(cu)) { String cuLocation = cu.getPath().makeRelative().toString(); String message = Messages.format( "{0}: Compilation unit not on build path. No changes applied.", cuLocation); status.add(new Status(IStatus.INFO, JavaUI.ID_PLUGIN, IStatus.ERROR, message, null)); return false; } return true; }
/** Configure this type hierarchy based on the given potential subtypes. */ private void buildFromPotentialSubtypes( String[] allPotentialSubTypes, HashSet localTypes, IProgressMonitor monitor) { IType focusType = getType(); // substitute compilation units with working copies HashMap wcPaths = new HashMap(); // a map from path to working copies int wcLength; org.eclipse.jdt.core.ICompilationUnit[] workingCopies = this.hierarchy.workingCopies; if (workingCopies != null && (wcLength = workingCopies.length) > 0) { String[] newPaths = new String[wcLength]; for (int i = 0; i < wcLength; i++) { org.eclipse.jdt.core.ICompilationUnit workingCopy = workingCopies[i]; String path = workingCopy.getPath().toString(); wcPaths.put(path, workingCopy); newPaths[i] = path; } int potentialSubtypesLength = allPotentialSubTypes.length; System.arraycopy( allPotentialSubTypes, 0, allPotentialSubTypes = new String[potentialSubtypesLength + wcLength], 0, potentialSubtypesLength); System.arraycopy(newPaths, 0, allPotentialSubTypes, potentialSubtypesLength, wcLength); } int length = allPotentialSubTypes.length; // inject the compilation unit of the focus type (so that types in // this cu have special visibility permission (this is also usefull // when the cu is a working copy) Openable focusCU = (Openable) focusType.getCompilationUnit(); String focusPath = null; if (focusCU != null) { focusPath = focusCU.getPath().toString(); if (length > 0) { System.arraycopy( allPotentialSubTypes, 0, allPotentialSubTypes = new String[length + 1], 0, length); allPotentialSubTypes[length] = focusPath; } else { allPotentialSubTypes = new String[] {focusPath}; } length++; } /* * Sort in alphabetical order so that potential subtypes are grouped per project */ Arrays.sort(allPotentialSubTypes); ArrayList potentialSubtypes = new ArrayList(); try { // create element infos for subtypes HandleFactory factory = new HandleFactory(); IJavaProject currentProject = null; if (monitor != null) monitor.beginTask( "", length * 2 /* 1 for build binding, 1 for connect hierarchy*/); // $NON-NLS-1$ for (int i = 0; i < length; i++) { try { String resourcePath = allPotentialSubTypes[i]; // skip duplicate paths (e.g. if focus path was injected when it was already a potential // subtype) if (i > 0 && resourcePath.equals(allPotentialSubTypes[i - 1])) continue; Openable handle; org.eclipse.jdt.core.ICompilationUnit workingCopy = (org.eclipse.jdt.core.ICompilationUnit) wcPaths.get(resourcePath); if (workingCopy != null) { handle = (Openable) workingCopy; } else { handle = resourcePath.equals(focusPath) ? focusCU : factory.createOpenable(resourcePath, this.scope); if (handle == null) continue; // match is outside classpath } IJavaProject project = handle.getJavaProject(); if (currentProject == null) { currentProject = project; potentialSubtypes = new ArrayList(5); } else if (!currentProject.equals(project)) { // build current project buildForProject( (JavaProject) currentProject, potentialSubtypes, workingCopies, localTypes, monitor); currentProject = project; potentialSubtypes = new ArrayList(5); } potentialSubtypes.add(handle); } catch (JavaModelException e) { continue; } } // build last project try { if (currentProject == null) { // case of no potential subtypes currentProject = focusType.getJavaProject(); if (focusType.isBinary()) { potentialSubtypes.add(focusType.getClassFile()); } else { potentialSubtypes.add(focusType.getCompilationUnit()); } } buildForProject( (JavaProject) currentProject, potentialSubtypes, workingCopies, localTypes, monitor); } catch (JavaModelException e) { // ignore } // Compute hierarchy of focus type if not already done (case of a type with potential subtypes // that are not real subtypes) if (!this.hierarchy.contains(focusType)) { try { currentProject = focusType.getJavaProject(); potentialSubtypes = new ArrayList(); if (focusType.isBinary()) { potentialSubtypes.add(focusType.getClassFile()); } else { potentialSubtypes.add(focusType.getCompilationUnit()); } buildForProject( (JavaProject) currentProject, potentialSubtypes, workingCopies, localTypes, monitor); } catch (JavaModelException e) { // ignore } } // Add focus if not already in (case of a type with no explicit super type) if (!this.hierarchy.contains(focusType)) { this.hierarchy.addRootClass(focusType); } } finally { if (monitor != null) monitor.done(); } }
/** * Copies/moves a package fragment with the name <code>newName</code> to the destination package. * <br> * * @exception JavaModelException if the operation is unable to complete */ private void processPackageFragmentResource( PackageFragment source, PackageFragmentRoot root, String newName) throws JavaModelException { try { String[] newFragName = (newName == null) ? source.names : Util.getTrimmedSimpleNames(newName); PackageFragment newFrag = root.getPackageFragment(newFragName); IResource[] resources = collectResourcesOfInterest(source); // if isMove() can we move the folder itself ? (see // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22458) boolean shouldMoveFolder = isMove() && !newFrag.resource().exists(); // if new pkg fragment exists, it is an override IFolder srcFolder = (IFolder) source.resource(); IPath destPath = newFrag.getPath(); if (shouldMoveFolder) { // check if destination is not included in source if (srcFolder.getFullPath().isPrefixOf(destPath)) { shouldMoveFolder = false; } else { // check if there are no sub-packages IResource[] members = srcFolder.members(); for (int i = 0; i < members.length; i++) { if (members[i] instanceof IFolder) { shouldMoveFolder = false; break; } } } } boolean containsReadOnlySubPackageFragments = createNeededPackageFragments( (IContainer) source.parent.resource(), root, newFragName, shouldMoveFolder); boolean sourceIsReadOnly = Util.isReadOnly(srcFolder); // Process resources if (shouldMoveFolder) { // move underlying resource // TODO Revisit once bug 43044 is fixed if (sourceIsReadOnly) { Util.setReadOnly(srcFolder, false); } srcFolder.move(destPath, this.force, true /* keep history */, getSubProgressMonitor(1)); if (sourceIsReadOnly) { Util.setReadOnly(srcFolder, true); } setAttribute(HAS_MODIFIED_RESOURCE_ATTR, TRUE); } else { // process the leaf resources if (resources.length > 0) { if (isRename()) { if (!destPath.equals(source.getPath())) { moveResources(resources, destPath); } } else if (isMove()) { // we need to delete this resource if this operation wants to override existing // resources for (int i = 0, max = resources.length; i < max; i++) { IResource destinationResource = ResourcesPlugin.getWorkspace() .getRoot() .findMember(destPath.append(resources[i].getName())); if (destinationResource != null) { if (this.force) { deleteResource(destinationResource, IResource.KEEP_HISTORY); } else { throw new JavaModelException( new JavaModelStatus( IJavaModelStatusConstants.NAME_COLLISION, Messages.bind( Messages.status_nameCollision, destinationResource.getFullPath().toString()))); } } } moveResources(resources, destPath); } else { // we need to delete this resource if this operation wants to override existing // resources for (int i = 0, max = resources.length; i < max; i++) { IResource destinationResource = ResourcesPlugin.getWorkspace() .getRoot() .findMember(destPath.append(resources[i].getName())); if (destinationResource != null) { if (this.force) { // we need to delete this resource if this operation wants to override existing // resources deleteResource(destinationResource, IResource.KEEP_HISTORY); } else { throw new JavaModelException( new JavaModelStatus( IJavaModelStatusConstants.NAME_COLLISION, Messages.bind( Messages.status_nameCollision, destinationResource.getFullPath().toString()))); } } } copyResources(resources, destPath); } } } // Update package statement in compilation unit if needed if (!Util.equalArraysOrNull( newFragName, source.names)) { // if package has been renamed, update the compilation units char[][] inclusionPatterns = root.fullInclusionPatternChars(); char[][] exclusionPatterns = root.fullExclusionPatternChars(); for (int i = 0; i < resources.length; i++) { String resourceName = resources[i].getName(); if (Util.isJavaLikeFileName(resourceName)) { // we only consider potential compilation units ICompilationUnit cu = newFrag.getCompilationUnit(resourceName); if (Util.isExcluded( cu.getPath(), inclusionPatterns, exclusionPatterns, false /*not a folder*/)) continue; this.parser.setSource(cu); CompilationUnit astCU = (CompilationUnit) this.parser.createAST(this.progressMonitor); AST ast = astCU.getAST(); ASTRewrite rewrite = ASTRewrite.create(ast); updatePackageStatement(astCU, newFragName, rewrite, cu); TextEdit edits = rewrite.rewriteAST(); applyTextEdit(cu, edits); cu.save(null, false); } } } // Discard empty old package (if still empty after the rename) boolean isEmpty = true; if (isMove()) { // delete remaining files in this package (.class file in the case where Proj=src=bin) // in case of a copy updateReadOnlyPackageFragmentsForMove( (IContainer) source.parent.resource(), root, newFragName, sourceIsReadOnly); if (srcFolder.exists()) { IResource[] remaining = srcFolder.members(); for (int i = 0, length = remaining.length; i < length; i++) { IResource file = remaining[i]; if (file instanceof IFile) { if (Util.isReadOnly(file)) { Util.setReadOnly(file, false); } deleteResource(file, IResource.FORCE | IResource.KEEP_HISTORY); } else { isEmpty = false; } } } if (isEmpty) { IResource rootResource; // check if source is included in destination if (destPath.isPrefixOf(srcFolder.getFullPath())) { rootResource = newFrag.resource(); } else { rootResource = source.parent.resource(); } // delete recursively empty folders deleteEmptyPackageFragment(source, false, rootResource); } } else if (containsReadOnlySubPackageFragments) { // in case of a copy updateReadOnlyPackageFragmentsForCopy( (IContainer) source.parent.resource(), root, newFragName); } // workaround for bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=24505 if (isEmpty && isMove() && !(Util.isExcluded(source) || Util.isExcluded(newFrag))) { IJavaProject sourceProject = source.getJavaProject(); getDeltaFor(sourceProject).movedFrom(source, newFrag); IJavaProject destProject = newFrag.getJavaProject(); getDeltaFor(destProject).movedTo(newFrag, source); } } catch (JavaModelException e) { throw e; } catch (CoreException ce) { throw new JavaModelException(ce); } }
private void doRunOnMultiple(ICompilationUnit[] cus, MultiStatus status, IProgressMonitor monitor) throws OperationCanceledException { if (monitor == null) { monitor = new NullProgressMonitor(); } monitor.setTaskName("Organizing imports..."); monitor.beginTask("", cus.length); // $NON-NLS-1$ try { IChooseImportQuery query = new IChooseImportQuery() { public TypeNameMatch[] chooseImports( TypeNameMatch[][] openChoices, ISourceRange[] ranges) { throw new OrganizeImportError(); } }; IJavaProject lastProject = null; for (int i = 0; i < cus.length; i++) { ICompilationUnit cu = cus[i]; if (testOnBuildPath(cu, status)) { if (lastProject == null || !lastProject.equals(cu.getJavaProject())) { lastProject = cu.getJavaProject(); } CodeGenerationSettings settings = JavaPreferencesSettings.getCodeGenerationSettings(lastProject); String cuLocation = cu.getPath().makeRelative().toString(); monitor.subTask(cuLocation); try { boolean save = !cu.isWorkingCopy(); if (!save) { ITextFileBuffer textFileBuffer = FileBuffers.getTextFileBufferManager().getTextFileBuffer(cu.getPath()); save = textFileBuffer != null && !textFileBuffer.isDirty(); // save when not dirty } AJOrganizeImportsOperation op = new AJOrganizeImportsOperation( cu, null, settings.importIgnoreLowercase, save, true, query); runInSync(op, cuLocation, status, monitor); IProblem parseError = op.getParseError(); if (parseError != null) { String message = Messages.format( ActionMessages.OrganizeImportsAction_multi_error_parse, cuLocation); status.add(new Status(IStatus.INFO, JavaUI.ID_PLUGIN, IStatus.ERROR, message, null)); } } catch (CoreException e) { JavaPlugin.log(e); String message = Messages.format( "{0}: Unexpected error. See log for details.", e.getStatus().getMessage()); status.add(new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, IStatus.ERROR, message, null)); } if (monitor.isCanceled()) { throw new OperationCanceledException(); } } } } finally { monitor.done(); } }
@Override public IProblemRequestor getProblemRequestor(ICompilationUnit workingCopy) { return get(workingCopy.getPath().toString(), JavaPadDocument.class).problems; }