diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.checkers.ui/META-INF/MANIFEST.MF index 9ae2f1f843f..bf21b4bd5d7 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/META-INF/MANIFEST.MF +++ b/codan/org.eclipse.cdt.codan.checkers.ui/META-INF/MANIFEST.MF @@ -11,6 +11,7 @@ Require-Bundle: org.eclipse.core.resources, org.eclipse.cdt.codan.core, org.eclipse.cdt.codan.core.cxx, org.eclipse.cdt.codan.ui.cxx, + org.eclipse.cdt.ui, org.eclipse.jface.text, org.eclipse.ltk.core.refactoring, org.eclipse.ui, diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/plugin.xml b/codan/org.eclipse.cdt.codan.checkers.ui/plugin.xml index 4bf258318e2..a0f1d5a77e5 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/plugin.xml +++ b/codan/org.eclipse.cdt.codan.checkers.ui/plugin.xml @@ -23,6 +23,10 @@ class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateLocalVariable" problemId="org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem"> + diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateNewClass.java b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateNewClass.java new file mode 100644 index 00000000000..0907027dc77 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixCreateNewClass.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2016 Alena Laskavaia + * 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: + * Alena Laskavaia - initial API and implementation, + * inspired by work of Erik Johansson + * + *******************************************************************************/ +package org.eclipse.cdt.codan.internal.checkers.ui.quickfix; + +import org.eclipse.cdt.codan.internal.checkers.ui.CheckersUiActivator; +import org.eclipse.cdt.codan.ui.AbstractCodanCMarkerResolution; +import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.ui.wizards.NewClassCreationWizard; +import org.eclipse.cdt.ui.CDTSharedImages; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.IMarkerResolution2; +import org.eclipse.ui.PlatformUI; + +public class QuickFixCreateNewClass extends AbstractCodanCMarkerResolution implements IMarkerResolution2 { + @Override + public String getLabel() { + // TODO Should provide class name as message parameter + return QuickFixMessages.QuickFixCreateClass_CreateNewClass; + } + + @Override + public boolean isApplicable(IMarker marker) { + ITranslationUnit tu = getTranslationUnitViaEditor(marker); + try { + if (tu.getLanguage().getLinkageID() == ILinkage.C_LINKAGE_ID) + return false; + } catch (CoreException e) { + // ignore + } + return true; + } + + @Override + public String getDescription() { + return QuickFixMessages.QuickFixCreateClass_CreateNewClass; + } + + @Override + public Image getImage() { + return CDTSharedImages.getImage("icons/etool16/newclass_wiz.gif"); //$NON-NLS-1$ + } + + @Override + public void apply(IMarker marker, IDocument document) { + String name = null; + try { + name = getProblemArgument(marker, 0); + } catch (Exception e) { + CheckersUiActivator.log(e); + // fallthrough + // will still open new wizard dialog but without class name filled + } + ICElement element = getCElementFromMarker(marker); + IStructuredSelection selection = element == null ? new StructuredSelection() : new StructuredSelection(element); + if (openWizard(name, selection) == Window.OK) { + try { + marker.delete(); + } catch (CoreException e) { + CheckersUiActivator.log(e); + } + } + } + + public int openWizard(final String className, IStructuredSelection selection) { + NewClassCreationWizard wizard = new NewClassCreationWizard(); + wizard.setClassName(className); + wizard.init(PlatformUI.getWorkbench(), selection); + return new WizardDialog(null, wizard).open(); + } +} diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.java b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.java index 3bbc35b063b..b92a501ec1b 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.java +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Alena Laskavaia and others. + * Copyright (c) 2011,2016 Alena Laskavaia 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 @@ -15,6 +15,7 @@ import org.eclipse.osgi.util.NLS; public class QuickFixMessages extends NLS { public static String CaseBreakQuickFixBreak_Label; public static String CaseBreakQuickFixComment_Label; + public static String QuickFixCreateClass_CreateNewClass; public static String QuickFixCreateField_create_field; public static String QuickFixCreateLocalVariable_create_local_variable; public static String QuickFixCreateParameter_create_parameter; diff --git a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.properties b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.properties index 87c8c046fd4..5d306e0c48b 100644 --- a/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.properties +++ b/codan/org.eclipse.cdt.codan.checkers.ui/src/org/eclipse/cdt/codan/internal/checkers/ui/quickfix/QuickFixMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2011 Alena Laskavaia and others. +# Copyright (c) 2011,2015 Alena Laskavaia 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 @@ -10,6 +10,7 @@ ############################################################################### CaseBreakQuickFixBreak_Label=Add break statement CaseBreakQuickFixComment_Label=Add suppressing comment +QuickFixCreateClass_CreateNewClass=Create new class QuickFixCreateField_create_field=Create field QuickFixCreateLocalVariable_create_local_variable=Create local variable QuickFixCreateParameter_create_parameter=Create parameter \ No newline at end of file diff --git a/codan/org.eclipse.cdt.codan.ui.cxx/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.ui.cxx/META-INF/MANIFEST.MF index 022ad8725fc..3e381bb301c 100644 --- a/codan/org.eclipse.cdt.codan.ui.cxx/META-INF/MANIFEST.MF +++ b/codan/org.eclipse.cdt.codan.ui.cxx/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.cdt.codan.ui.cxx;singleton:=true -Bundle-Version: 3.2.0.qualifier +Bundle-Version: 3.3.0.qualifier Bundle-Activator: org.eclipse.cdt.codan.internal.ui.cxx.Activator Bundle-Vendor: %Bundle-Vendor Require-Bundle: org.eclipse.ui, diff --git a/codan/org.eclipse.cdt.codan.ui.cxx/pom.xml b/codan/org.eclipse.cdt.codan.ui.cxx/pom.xml index e9ba5a1898d..0ac1b6c7e3c 100644 --- a/codan/org.eclipse.cdt.codan.ui.cxx/pom.xml +++ b/codan/org.eclipse.cdt.codan.ui.cxx/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 3.2.0-SNAPSHOT + 3.3.0-SNAPSHOT org.eclipse.cdt.codan.ui.cxx eclipse-plugin diff --git a/codan/org.eclipse.cdt.codan.ui.cxx/src/org/eclipse/cdt/codan/ui/AbstractCodanCMarkerResolution.java b/codan/org.eclipse.cdt.codan.ui.cxx/src/org/eclipse/cdt/codan/ui/AbstractCodanCMarkerResolution.java index c7544172472..a37d148d731 100644 --- a/codan/org.eclipse.cdt.codan.ui.cxx/src/org/eclipse/cdt/codan/ui/AbstractCodanCMarkerResolution.java +++ b/codan/org.eclipse.cdt.codan.ui.cxx/src/org/eclipse/cdt/codan/ui/AbstractCodanCMarkerResolution.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2011 Alena Laskavaia + * Copyright (c) 2009, 2011 Alena Laskavaia * 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 @@ -20,7 +20,9 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CDTUITools; @@ -42,7 +44,7 @@ import org.eclipse.ui.texteditor.ITextEditor; * class for codanMarkerResolution extension. To add specific icon and * description client class should additionally implement * {@link IMarkerResolution2} - * + * * @since 2.0 */ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerResolution { @@ -51,7 +53,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Get position offset from marker. If CHAR_START attribute is not set for * marker, line and document would be used. - * + * * @param marker * @param doc * @return @@ -82,10 +84,11 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Runs this resolution. - * + * * @param marker * the marker to resolve */ + @Override public void run(IMarker marker) { IDocument doc = openDocument(marker); if (doc != null) { @@ -96,7 +99,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Apply marker resolution for given marker in given open document. - * + * * @param marker * @param document */ @@ -105,10 +108,11 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Override is extra checks is required to determine appicablity of marker * resolution - * + * * @param marker * @return */ + @Override public boolean isApplicable(IMarker marker) { return true; } @@ -118,7 +122,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso * returns the corresponding IEditorPart. Please note that is code analysis * is setup to run on reconsile this action would trigger checkers run, and * original marker may be removed as a result. - * + * * @param marker * the problem marker * @return the opened document @@ -137,7 +141,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Opens the editor and returns the document corresponding to a given * marker. - * + * * @param marker * the marker to find the editor * @return the corresponding document @@ -148,7 +152,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Returns the document corresponding to a given editor part. - * + * * @param editorPart * an editor part * @return the document of that part @@ -164,7 +168,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Receives a translation unit from a given marker. Opens the editor. - * + * * @param marker * A marker in an editor to get the translation unit * @return The translation unit @@ -176,7 +180,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Receives a translation unit from a given marker using the marker's path. - * + * * @param marker * A marker in a translation unit * @return The translation unit @@ -190,7 +194,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso /** * Receives an ASTName enclosing a given IMarker - * + * * @param marker * The marker enclosing an ASTName * @param ast @@ -214,10 +218,40 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso return name; } + /** + * Returns the smallest element within translation unit that + * includes the given source position (that is, a method, field, etc.), or + * {@code null} if there is no element other than the translation + * unit itself at the given position, or if the given position is not + * within the source range of this translation unit. + * + * @param marker that contains a position inside the translation unit + * @return the innermost C element enclosing a given source position or + * {@code null} + * if none found (excluding the translation unit). + * @since 3.3 + */ + protected ICElement getCElementFromMarker(IMarker marker) { + ITranslationUnit tu = getTranslationUnitViaEditor(marker); + ICElement element = null; + try { + int charStart = marker.getAttribute(IMarker.CHAR_START, -1); + if (charStart > 0) { + element = tu.getElementAtOffset(charStart); + } else { + int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, -1); + element = tu.getElementAtLine(lineNumber); + } + } catch (CModelException e) { + CodanUIActivator.log(e); + } + return element; + } + /** * Receives an {@link IIndex} corresponding to the given {@link IMarker}'s * resource. - * + * * @param marker * the marker to use * @return the received index diff --git a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF index c235b6036f4..3cb3d804704 100644 --- a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF @@ -65,7 +65,7 @@ Export-Package: org.eclipse.cdt.internal.corext;x-internal:=true, org.eclipse.cdt.internal.ui.typehierarchy;x-internal:=true, org.eclipse.cdt.internal.ui.util;x-friends:="org.eclipse.cdt.debug.ui,org.eclipse.cdt.debug.edc.tests,org.eclipse.cdt.managedbuilder.ui", org.eclipse.cdt.internal.ui.viewsupport;x-internal:=true, - org.eclipse.cdt.internal.ui.wizards;x-internal:=true, + org.eclipse.cdt.internal.ui.wizards;x-friends:="org.eclipse.cdt.codan.checkers.ui", org.eclipse.cdt.internal.ui.wizards.classwizard;x-internal:=true, org.eclipse.cdt.internal.ui.wizards.dialogfields;x-friends:="org.eclipse.cdt.codan.ui", org.eclipse.cdt.internal.ui.wizards.filewizard;x-internal:=true, diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/NewClassCreationWizard.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/NewClassCreationWizard.java index eb91415eeb5..33c9594127d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/NewClassCreationWizard.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/NewClassCreationWizard.java @@ -21,53 +21,68 @@ import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.internal.ui.wizards.classwizard.NewClassWizardMessages; public class NewClassCreationWizard extends NewElementWizard { - private NewClassCreationWizardPage fPage; - - public NewClassCreationWizard() { - super(); - setDefaultPageImageDescriptor(CPluginImages.DESC_WIZBAN_NEWCLASS); - setDialogSettings(CUIPlugin.getDefault().getDialogSettings()); - setWindowTitle(NewClassWizardMessages.NewClassCreationWizard_title); - } - - /* - * @see Wizard#createPages - */ - @Override + private NewClassCreationWizardPage fPage; + private String className; + + public NewClassCreationWizard() { + super(); + setDefaultPageImageDescriptor(CPluginImages.DESC_WIZBAN_NEWCLASS); + setDialogSettings(CUIPlugin.getDefault().getDialogSettings()); + setWindowTitle(NewClassWizardMessages.NewClassCreationWizard_title); + } + + /* + * @see Wizard#createPages + */ + @Override public void addPages() { - super.addPages(); - fPage = new NewClassCreationWizardPage(); - addPage(fPage); - fPage.init(getSelection()); - } - - @Override + super.addPages(); + fPage = new NewClassCreationWizardPage(); + addPage(fPage); + fPage.init(getSelection()); + if (className != null) + fPage.setClassName(className, true); + } + + /** + * Sets the class name for creation in the wizard. + * + * @param className + * Name of the class or null, null will indicate default behavior + * which is extract class name from editor context. Setting an + * empty string will force the empty fields. + */ + public void setClassName(String className) { + this.className = className; + } + + @Override protected boolean canRunForked() { - return !fPage.isNamespaceSelected(); - } - - @Override + return !fPage.isNamespaceSelected(); + } + + @Override protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException { - fPage.createClass(monitor); // use the full progress monitor - } - - @Override + fPage.createClass(monitor); // use the full progress monitor + } + + @Override public boolean performFinish() { - boolean finished = super.performFinish(); - if (finished) { - if (fPage.openClassInEditor()) { - IFile source = fPage.getCreatedSourceFile(); - if (source != null) { - selectAndReveal(source); - openResource(source); - } - IFile header = fPage.getCreatedHeaderFile(); - if (header != null) { - selectAndReveal(header); - openResource(header); - } - } - } - return finished; - } + boolean finished = super.performFinish(); + if (finished) { + if (fPage.openClassInEditor()) { + IFile source = fPage.getCreatedSourceFile(); + if (source != null) { + selectAndReveal(source); + openResource(source); + } + IFile header = fPage.getCreatedHeaderFile(); + if (header != null) { + selectAndReveal(header); + openResource(header); + } + } + } + return finished; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/NewClassCreationWizardPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/NewClassCreationWizardPage.java index 4826970cc55..42a678047d6 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/NewClassCreationWizardPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/NewClassCreationWizardPage.java @@ -448,13 +448,12 @@ public class NewClassCreationWizardPage extends NewElementWizardPage { } } } - if (namespace == null) { - namespace = fDialogSettings.get(KEY_NAMESPACE); - } + if (namespace == null) { + namespace = fDialogSettings.get(KEY_NAMESPACE); + } - setNamespaceText(namespace, false); - setNamespaceSelection(namespace != null || fDialogSettings.getBoolean(KEY_NAMESPACE_SELECTED), - true); + setNamespaceText(namespace, false); + setNamespaceSelection(namespace != null || fDialogSettings.getBoolean(KEY_NAMESPACE_SELECTED), true); IPath folderPath = null; if (celem != null) { @@ -479,7 +478,8 @@ public class NewClassCreationWizardPage extends NewElementWizardPage { className = text; } } - setClassName(className, false); + // Forcing update will also populate default file names. + setClassName(className, true); IMethodStub[] stubs = getDefaultMethodStubs(); for (int i = 0; i < stubs.length; ++i) {