mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
Bug 411579 - Add a "Create new class" Quick fix.
Change-Id: I57dc46f079357de7d5c281d016a25baa3f2154a6
This commit is contained in:
parent
bc953d2348
commit
d3e933501e
11 changed files with 215 additions and 70 deletions
|
@ -11,6 +11,7 @@ Require-Bundle: org.eclipse.core.resources,
|
||||||
org.eclipse.cdt.codan.core,
|
org.eclipse.cdt.codan.core,
|
||||||
org.eclipse.cdt.codan.core.cxx,
|
org.eclipse.cdt.codan.core.cxx,
|
||||||
org.eclipse.cdt.codan.ui.cxx,
|
org.eclipse.cdt.codan.ui.cxx,
|
||||||
|
org.eclipse.cdt.ui,
|
||||||
org.eclipse.jface.text,
|
org.eclipse.jface.text,
|
||||||
org.eclipse.ltk.core.refactoring,
|
org.eclipse.ltk.core.refactoring,
|
||||||
org.eclipse.ui,
|
org.eclipse.ui,
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateLocalVariable"
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateLocalVariable"
|
||||||
problemId="org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem">
|
problemId="org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem">
|
||||||
</resolution>
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateNewClass"
|
||||||
|
problemId="org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem"
|
||||||
|
/>
|
||||||
<resolution
|
<resolution
|
||||||
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateLocalVariable"
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateLocalVariable"
|
||||||
messagePattern="`(.*)' undeclared \(first use in this function\)">
|
messagePattern="`(.*)' undeclared \(first use in this function\)">
|
||||||
|
|
|
@ -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 <erik.johansson.979@gmail.com>
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -15,6 +15,7 @@ import org.eclipse.osgi.util.NLS;
|
||||||
public class QuickFixMessages extends NLS {
|
public class QuickFixMessages extends NLS {
|
||||||
public static String CaseBreakQuickFixBreak_Label;
|
public static String CaseBreakQuickFixBreak_Label;
|
||||||
public static String CaseBreakQuickFixComment_Label;
|
public static String CaseBreakQuickFixComment_Label;
|
||||||
|
public static String QuickFixCreateClass_CreateNewClass;
|
||||||
public static String QuickFixCreateField_create_field;
|
public static String QuickFixCreateField_create_field;
|
||||||
public static String QuickFixCreateLocalVariable_create_local_variable;
|
public static String QuickFixCreateLocalVariable_create_local_variable;
|
||||||
public static String QuickFixCreateParameter_create_parameter;
|
public static String QuickFixCreateParameter_create_parameter;
|
||||||
|
|
|
@ -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
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
CaseBreakQuickFixBreak_Label=Add break statement
|
CaseBreakQuickFixBreak_Label=Add break statement
|
||||||
CaseBreakQuickFixComment_Label=Add suppressing comment
|
CaseBreakQuickFixComment_Label=Add suppressing comment
|
||||||
|
QuickFixCreateClass_CreateNewClass=Create new class
|
||||||
QuickFixCreateField_create_field=Create field
|
QuickFixCreateField_create_field=Create field
|
||||||
QuickFixCreateLocalVariable_create_local_variable=Create local variable
|
QuickFixCreateLocalVariable_create_local_variable=Create local variable
|
||||||
QuickFixCreateParameter_create_parameter=Create parameter
|
QuickFixCreateParameter_create_parameter=Create parameter
|
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: %Bundle-Name
|
Bundle-Name: %Bundle-Name
|
||||||
Bundle-SymbolicName: org.eclipse.cdt.codan.ui.cxx;singleton:=true
|
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-Activator: org.eclipse.cdt.codan.internal.ui.cxx.Activator
|
||||||
Bundle-Vendor: %Bundle-Vendor
|
Bundle-Vendor: %Bundle-Vendor
|
||||||
Require-Bundle: org.eclipse.ui,
|
Require-Bundle: org.eclipse.ui,
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<version>3.2.0-SNAPSHOT</version>
|
<version>3.3.0-SNAPSHOT</version>
|
||||||
<artifactId>org.eclipse.cdt.codan.ui.cxx</artifactId>
|
<artifactId>org.eclipse.cdt.codan.ui.cxx</artifactId>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -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.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
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.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.cdt.ui.CDTUITools;
|
import org.eclipse.cdt.ui.CDTUITools;
|
||||||
|
@ -86,6 +88,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso
|
||||||
* @param marker
|
* @param marker
|
||||||
* the marker to resolve
|
* the marker to resolve
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void run(IMarker marker) {
|
public void run(IMarker marker) {
|
||||||
IDocument doc = openDocument(marker);
|
IDocument doc = openDocument(marker);
|
||||||
if (doc != null) {
|
if (doc != null) {
|
||||||
|
@ -109,6 +112,7 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso
|
||||||
* @param marker
|
* @param marker
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean isApplicable(IMarker marker) {
|
public boolean isApplicable(IMarker marker) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -214,6 +218,36 @@ public abstract class AbstractCodanCMarkerResolution implements ICodanMarkerReso
|
||||||
return name;
|
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
|
* Receives an {@link IIndex} corresponding to the given {@link IMarker}'s
|
||||||
* resource.
|
* resource.
|
||||||
|
|
|
@ -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.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.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.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.classwizard;x-internal:=true,
|
||||||
org.eclipse.cdt.internal.ui.wizards.dialogfields;x-friends:="org.eclipse.cdt.codan.ui",
|
org.eclipse.cdt.internal.ui.wizards.dialogfields;x-friends:="org.eclipse.cdt.codan.ui",
|
||||||
org.eclipse.cdt.internal.ui.wizards.filewizard;x-internal:=true,
|
org.eclipse.cdt.internal.ui.wizards.filewizard;x-internal:=true,
|
||||||
|
|
|
@ -21,53 +21,68 @@ import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
import org.eclipse.cdt.internal.ui.wizards.classwizard.NewClassWizardMessages;
|
import org.eclipse.cdt.internal.ui.wizards.classwizard.NewClassWizardMessages;
|
||||||
|
|
||||||
public class NewClassCreationWizard extends NewElementWizard {
|
public class NewClassCreationWizard extends NewElementWizard {
|
||||||
private NewClassCreationWizardPage fPage;
|
private NewClassCreationWizardPage fPage;
|
||||||
|
private String className;
|
||||||
|
|
||||||
public NewClassCreationWizard() {
|
public NewClassCreationWizard() {
|
||||||
super();
|
super();
|
||||||
setDefaultPageImageDescriptor(CPluginImages.DESC_WIZBAN_NEWCLASS);
|
setDefaultPageImageDescriptor(CPluginImages.DESC_WIZBAN_NEWCLASS);
|
||||||
setDialogSettings(CUIPlugin.getDefault().getDialogSettings());
|
setDialogSettings(CUIPlugin.getDefault().getDialogSettings());
|
||||||
setWindowTitle(NewClassWizardMessages.NewClassCreationWizard_title);
|
setWindowTitle(NewClassWizardMessages.NewClassCreationWizard_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see Wizard#createPages
|
* @see Wizard#createPages
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addPages() {
|
public void addPages() {
|
||||||
super.addPages();
|
super.addPages();
|
||||||
fPage = new NewClassCreationWizardPage();
|
fPage = new NewClassCreationWizardPage();
|
||||||
addPage(fPage);
|
addPage(fPage);
|
||||||
fPage.init(getSelection());
|
fPage.init(getSelection());
|
||||||
}
|
if (className != null)
|
||||||
|
fPage.setClassName(className, true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* 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() {
|
protected boolean canRunForked() {
|
||||||
return !fPage.isNamespaceSelected();
|
return !fPage.isNamespaceSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException {
|
protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException {
|
||||||
fPage.createClass(monitor); // use the full progress monitor
|
fPage.createClass(monitor); // use the full progress monitor
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean performFinish() {
|
public boolean performFinish() {
|
||||||
boolean finished = super.performFinish();
|
boolean finished = super.performFinish();
|
||||||
if (finished) {
|
if (finished) {
|
||||||
if (fPage.openClassInEditor()) {
|
if (fPage.openClassInEditor()) {
|
||||||
IFile source = fPage.getCreatedSourceFile();
|
IFile source = fPage.getCreatedSourceFile();
|
||||||
if (source != null) {
|
if (source != null) {
|
||||||
selectAndReveal(source);
|
selectAndReveal(source);
|
||||||
openResource(source);
|
openResource(source);
|
||||||
}
|
}
|
||||||
IFile header = fPage.getCreatedHeaderFile();
|
IFile header = fPage.getCreatedHeaderFile();
|
||||||
if (header != null) {
|
if (header != null) {
|
||||||
selectAndReveal(header);
|
selectAndReveal(header);
|
||||||
openResource(header);
|
openResource(header);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return finished;
|
return finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -448,13 +448,12 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (namespace == null) {
|
if (namespace == null) {
|
||||||
namespace = fDialogSettings.get(KEY_NAMESPACE);
|
namespace = fDialogSettings.get(KEY_NAMESPACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
setNamespaceText(namespace, false);
|
setNamespaceText(namespace, false);
|
||||||
setNamespaceSelection(namespace != null || fDialogSettings.getBoolean(KEY_NAMESPACE_SELECTED),
|
setNamespaceSelection(namespace != null || fDialogSettings.getBoolean(KEY_NAMESPACE_SELECTED), true);
|
||||||
true);
|
|
||||||
|
|
||||||
IPath folderPath = null;
|
IPath folderPath = null;
|
||||||
if (celem != null) {
|
if (celem != null) {
|
||||||
|
@ -479,7 +478,8 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
||||||
className = text;
|
className = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setClassName(className, false);
|
// Forcing update will also populate default file names.
|
||||||
|
setClassName(className, true);
|
||||||
|
|
||||||
IMethodStub[] stubs = getDefaultMethodStubs();
|
IMethodStub[] stubs = getDefaultMethodStubs();
|
||||||
for (int i = 0; i < stubs.length; ++i) {
|
for (int i = 0; i < stubs.length; ++i) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue