mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 09:16:02 +02:00
Bug 511229 - RFE: Add quick fixes for some basic gcc errors
- change codanMarkerResolution schema to support translatable regex statements for matching - bump cdt.codan.ui version - add additional codanMarkerResolution extensions to codan.checkers.ui to handle some basic gcc error messages with quick fixes - add QuickFixAddSemicolon, QuickFixRenameMember, QuickFixUseDotOperator, and QuickFixUsePointer classes - add new QuickFixMessages - add plugin.properties to cdt.codan.checkers.ui to allow the quick fix regex matchers to be translated in the future - change the generic error message for gcc error parser so that the column is reported as the problem variable (useful for certain quick fix resolutions) - bump up cdt.core Change-Id: Ibb24c1a79c4d91ead3fc629ea3d4e7425b4e7f23
This commit is contained in:
parent
e93de453f8
commit
7d0117d24e
17 changed files with 441 additions and 9 deletions
|
@ -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.checkers.ui;singleton:=true
|
Bundle-SymbolicName: org.eclipse.cdt.codan.checkers.ui;singleton:=true
|
||||||
Bundle-Version: 3.2.0.qualifier
|
Bundle-Version: 3.2.1.qualifier
|
||||||
Bundle-Activator: org.eclipse.cdt.codan.internal.checkers.ui.CheckersUiActivator
|
Bundle-Activator: org.eclipse.cdt.codan.internal.checkers.ui.CheckersUiActivator
|
||||||
Require-Bundle: org.eclipse.core.resources,
|
Require-Bundle: org.eclipse.core.resources,
|
||||||
org.eclipse.core.runtime,
|
org.eclipse.core.runtime,
|
||||||
|
@ -19,6 +19,7 @@ Require-Bundle: org.eclipse.core.resources,
|
||||||
Bundle-ActivationPolicy: lazy
|
Bundle-ActivationPolicy: lazy
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
Bundle-Vendor: %Bundle-Vendor
|
Bundle-Vendor: %Bundle-Vendor
|
||||||
|
Bundle-Localization: plugin
|
||||||
Export-Package: org.eclipse.cdt.codan.internal.checkers.ui;x-internal:=true,
|
Export-Package: org.eclipse.cdt.codan.internal.checkers.ui;x-internal:=true,
|
||||||
org.eclipse.cdt.codan.internal.checkers.ui.quickfix;x-friends:="org.eclipse.cdt.codan.checkers.ui.test"
|
org.eclipse.cdt.codan.internal.checkers.ui.quickfix;x-friends:="org.eclipse.cdt.codan.checkers.ui.test"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
GCCFixitNoMember.errormsg=\u2018(.*)\u2019 has no member named \u2018(.*)\u2019.*did you mean \u2018(.*)\u2019.*
|
||||||
|
GCCFixitMissingSemicolon.errormsg=expected \u2018;\u2019 before \u2018(.*)\u2019.*
|
||||||
|
GCCFixitNoPointerOpCPP=request for member \u2018.*\u2019 in \u2018(.*)\u2019, which is of pointer type \u2018.*\u2019.*maybe you meant to use \u2018->\u2019.*
|
||||||
|
GCCFixitNoPointerOperator.errormsg=\u2018(.*)\u2019 is a pointer(.*)did you mean to use \u2018->\u2019.*
|
||||||
|
GCCFixitInvalidPtrTypeCPP=base operand of \u2018->\u2019 has non-pointer type \u2018(.*)\u2019.*
|
||||||
|
GCCFixitInvalidPtrStruct.errormsg=invalid type argument of \u2018->\u2019.*have \u2018struct (.*)\u2019.*
|
|
@ -31,6 +31,30 @@
|
||||||
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\)">
|
||||||
</resolution>
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixRenameMember"
|
||||||
|
messagePattern="%GCCFixitNoMember.errormsg">
|
||||||
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixAddSemicolon"
|
||||||
|
messagePattern="%GCCFixitMissingSemicolon.errormsg">
|
||||||
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixUsePointer"
|
||||||
|
messagePattern="%GCCFixitNoPointerOpCPP">
|
||||||
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixUsePointer"
|
||||||
|
messagePattern="%GCCFixitNoPointerOperator.errormsg">
|
||||||
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixUseDotOperator"
|
||||||
|
messagePattern="%GCCFixitInvalidPtrTypeCPP">
|
||||||
|
</resolution>
|
||||||
|
<resolution
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixUseDotOperator"
|
||||||
|
messagePattern="%GCCFixitInvalidPtrStruct.errormsg">
|
||||||
|
</resolution>
|
||||||
<resolution
|
<resolution
|
||||||
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateField"
|
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.QuickFixCreateField"
|
||||||
problemId="org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem">
|
problemId="org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem">
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<version>3.2.0-SNAPSHOT</version>
|
<version>3.2.1-SNAPSHOT</version>
|
||||||
<artifactId>org.eclipse.cdt.codan.checkers.ui</artifactId>
|
<artifactId>org.eclipse.cdt.codan.checkers.ui</artifactId>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 Red Hat Inc.
|
||||||
|
* 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:
|
||||||
|
* Red Hat Inc. - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.internal.checkers.ui.quickfix;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.codan.internal.checkers.ui.CheckersUiActivator;
|
||||||
|
import org.eclipse.cdt.codan.ui.AbstractAstRewriteQuickFix;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
|
import org.eclipse.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
|
||||||
|
public class QuickFixAddSemicolon extends AbstractAstRewriteQuickFix {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return QuickFixMessages.QuickFixAddSemicolon_add_semicolon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifyAST(IIndex index, IMarker marker) {
|
||||||
|
IASTTranslationUnit ast;
|
||||||
|
try {
|
||||||
|
ITranslationUnit tu = getTranslationUnitViaEditor(marker);
|
||||||
|
ast = tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IASTNode astNode = null;
|
||||||
|
if (isCodanProblem())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// We need to back up in the file
|
||||||
|
|
||||||
|
// Start by finding the original reported position and line number
|
||||||
|
int lineNum = marker.getAttribute(IMarker.LINE_NUMBER, 0) - 1;
|
||||||
|
|
||||||
|
if (lineNum < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IDocument document = getDocument();
|
||||||
|
|
||||||
|
int lineOffset;
|
||||||
|
int lineLength;
|
||||||
|
try {
|
||||||
|
lineOffset = document.getLineOffset(lineNum);
|
||||||
|
lineLength = document.getLineLength(lineNum);
|
||||||
|
} catch (BadLocationException e2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the position of the reported token
|
||||||
|
int pos = getOffset(marker, getDocument());
|
||||||
|
String name = null;
|
||||||
|
try {
|
||||||
|
name = getProblemArgument(marker, 0);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (name == null)
|
||||||
|
return;
|
||||||
|
FindReplaceDocumentAdapter dad = new FindReplaceDocumentAdapter(getDocument());
|
||||||
|
IRegion region;
|
||||||
|
try {
|
||||||
|
region = dad.find(pos, name,
|
||||||
|
/* forwardSearch */true, /* caseSensitive */true,
|
||||||
|
/* wholeWord */false, /* regExSearch */false);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (region == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// now we have the offset
|
||||||
|
int offset = region.getOffset();
|
||||||
|
IASTNode prevNode = null;
|
||||||
|
|
||||||
|
// see if there are previous nodes on same line
|
||||||
|
if (lineOffset < offset) {
|
||||||
|
astNode = getASTFirstContainedNodeFromPosition(ast, lineOffset, lineLength);
|
||||||
|
if (astNode != null) {
|
||||||
|
IASTFileLocation fileLoc = astNode.getFileLocation();
|
||||||
|
if (fileLoc == null)
|
||||||
|
return;
|
||||||
|
int length = lineLength;
|
||||||
|
while (fileLoc.getNodeOffset() < offset) {
|
||||||
|
prevNode = astNode;
|
||||||
|
astNode = getASTFirstContainedNodeFromPosition(ast, fileLoc.getNodeOffset() + fileLoc.getNodeLength(), length);
|
||||||
|
fileLoc = astNode.getFileLocation();
|
||||||
|
if (fileLoc == null)
|
||||||
|
return;
|
||||||
|
length -= fileLoc.getNodeLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we didn't find the previous node on the same line, go back a line at a time and find last node on line
|
||||||
|
while (prevNode == null) {
|
||||||
|
lineNum -= 1;
|
||||||
|
if (lineNum < 0)
|
||||||
|
return; // don't bother once we have reached start of file
|
||||||
|
try {
|
||||||
|
lineOffset = document.getLineOffset(lineNum);
|
||||||
|
lineLength = document.getLineLength(lineNum);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int x = lineOffset;
|
||||||
|
int leftover = lineLength;
|
||||||
|
// get a node at a time from line and keep track of last node found
|
||||||
|
while (x < lineOffset + lineLength) {
|
||||||
|
astNode = getASTFirstContainedNodeFromPosition(ast, x, leftover);
|
||||||
|
if (astNode == null)
|
||||||
|
break;
|
||||||
|
prevNode = astNode;
|
||||||
|
IASTFileLocation fileLoc = astNode.getFileLocation();
|
||||||
|
if (fileLoc == null)
|
||||||
|
break;
|
||||||
|
x += fileLoc.getNodeLength();
|
||||||
|
leftover -= fileLoc.getNodeLength();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
IASTFileLocation location = prevNode.getFileLocation();
|
||||||
|
if (location == null)
|
||||||
|
return;
|
||||||
|
int replacementLoc = location.getNodeOffset() + location.getNodeLength();
|
||||||
|
// in the case of a Problem statement, it might include \n or \r\n as part
|
||||||
|
// of the node, so we must just assume the semi-colon belongs at the end of
|
||||||
|
// the line
|
||||||
|
if (replacementLoc == offset)
|
||||||
|
replacementLoc -= System.lineSeparator().length();
|
||||||
|
try {
|
||||||
|
// insert the semi-colon
|
||||||
|
document.replace(replacementLoc, 0, ";"); //$NON-NLS-1$
|
||||||
|
} catch (BadLocationException e1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// remove marker now that has been dealt with
|
||||||
|
marker.delete();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ast
|
||||||
|
* @param charStart
|
||||||
|
* @param length
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private IASTNode getASTFirstContainedNodeFromPosition(IASTTranslationUnit ast, final int charStart, final int length) {
|
||||||
|
IASTNode node = ast.getNodeSelector(null).findFirstContainedNode(charStart, length);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -19,6 +19,11 @@ public class QuickFixMessages extends NLS {
|
||||||
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;
|
||||||
|
public static String QuickFixRenameMember_rename_member;
|
||||||
|
public static String QuickFixAddSemicolon_add_semicolon;
|
||||||
|
public static String QuickFixUsePointer_replace_dot;
|
||||||
|
public static String QuickFixUseDotOperator_replace_ptr;
|
||||||
|
public static String QuickFixForFixit_apply_fixit;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
NLS.initializeMessages(QuickFixMessages.class.getName(), QuickFixMessages.class);
|
NLS.initializeMessages(QuickFixMessages.class.getName(), QuickFixMessages.class);
|
||||||
|
|
|
@ -14,3 +14,8 @@ 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
|
||||||
|
QuickFixRenameMember_rename_member=Rename to suggested member
|
||||||
|
QuickFixAddSemicolon_add_semicolon=Add semicolon
|
||||||
|
QuickFixUsePointer_replace_dot=Replace '.' with '->'
|
||||||
|
QuickFixUseDotOperator_replace_ptr=Replace '->' with '.'
|
||||||
|
QuickFixForFixit_apply_fixit=Apply compiler recommended fix-it
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 Red Hat Inc.
|
||||||
|
* 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:
|
||||||
|
* Red Hat Inc. - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.internal.checkers.ui.quickfix;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.codan.internal.checkers.ui.CheckersUiActivator;
|
||||||
|
import org.eclipse.cdt.codan.internal.core.model.CodanProblemMarker;
|
||||||
|
import org.eclipse.cdt.codan.ui.AbstractAstRewriteQuickFix;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.INodeFactory;
|
||||||
|
import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
|
||||||
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
|
import org.eclipse.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
import org.eclipse.ltk.core.refactoring.Change;
|
||||||
|
|
||||||
|
public class QuickFixRenameMember extends AbstractAstRewriteQuickFix {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return QuickFixMessages.QuickFixRenameMember_rename_member;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifyAST(IIndex index, IMarker marker) {
|
||||||
|
IASTTranslationUnit ast;
|
||||||
|
try {
|
||||||
|
ITranslationUnit tu = getTranslationUnitViaEditor(marker);
|
||||||
|
ast = tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IASTName astName;
|
||||||
|
if (isCodanProblem()) {
|
||||||
|
astName = getASTNameFromMarker(marker, ast);
|
||||||
|
} else {
|
||||||
|
astName = getAstNameFromProblemArgument(marker, ast, 1);
|
||||||
|
}
|
||||||
|
if (astName == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ASTRewrite r = ASTRewrite.create(ast);
|
||||||
|
INodeFactory factory = ast.getASTNodeFactory();
|
||||||
|
|
||||||
|
String[] args = CodanProblemMarker.getProblemArguments(marker);
|
||||||
|
if (args == null || args.length < 3)
|
||||||
|
return;
|
||||||
|
IASTName newName = factory.newName(args[2]);
|
||||||
|
r.replace(astName, newName, null);
|
||||||
|
Change c = r.rewriteAST();
|
||||||
|
try {
|
||||||
|
c.perform(new NullProgressMonitor());
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
marker.delete();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 Red Hat Inc.
|
||||||
|
* 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:
|
||||||
|
* Red Hat Inc. - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
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.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
|
||||||
|
public class QuickFixUseDotOperator extends AbstractCodanCMarkerResolution {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return QuickFixMessages.QuickFixUseDotOperator_replace_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(IMarker marker, IDocument document) {
|
||||||
|
int lineNum = marker.getAttribute(IMarker.LINE_NUMBER, -1);
|
||||||
|
try {
|
||||||
|
if (lineNum >= 0) {
|
||||||
|
FindReplaceDocumentAdapter dad = new FindReplaceDocumentAdapter(document);
|
||||||
|
int lineOffset = document.getLineOffset(lineNum - 1);
|
||||||
|
int columnOffset = getColumnOffset(marker);
|
||||||
|
IRegion region;
|
||||||
|
try {
|
||||||
|
region = dad.find(lineOffset + columnOffset, "->", //$NON-NLS-1$
|
||||||
|
/* forwardSearch */true, /* caseSensitive */true,
|
||||||
|
/* wholeWord */true, /* regExSearch */false);
|
||||||
|
document.replace(region.getOffset(), 2, "."); //$NON-NLS-1$
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
marker.delete();
|
||||||
|
} catch (BadLocationException | CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getColumnOffset(IMarker marker) {
|
||||||
|
// Get the column offset from the problem.variable attribute which is set for
|
||||||
|
// the generic C/C++ error message in cdt.core.
|
||||||
|
String offset = marker.getAttribute("problem.variable", "1:"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
if (offset.charAt(offset.length() - 1) == ':') {
|
||||||
|
String strToParse = offset.substring(0, offset.length() - 1);
|
||||||
|
return Integer.parseInt(strToParse) - 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2017 Red Hat Inc.
|
||||||
|
* 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:
|
||||||
|
* Red Hat Inc. - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
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.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
|
||||||
|
public class QuickFixUsePointer extends AbstractCodanCMarkerResolution {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return QuickFixMessages.QuickFixUsePointer_replace_dot;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(IMarker marker, IDocument document) {
|
||||||
|
int lineNum = marker.getAttribute(IMarker.LINE_NUMBER, -1);
|
||||||
|
try {
|
||||||
|
if (lineNum >= 0) {
|
||||||
|
FindReplaceDocumentAdapter dad = new FindReplaceDocumentAdapter(document);
|
||||||
|
int lineOffset = document.getLineOffset(lineNum - 1);
|
||||||
|
int columnOffset = getColumnOffset(marker);
|
||||||
|
IRegion region;
|
||||||
|
try {
|
||||||
|
region = dad.find(lineOffset + columnOffset - 1, ".", //$NON-NLS-1$
|
||||||
|
/* forwardSearch */true, /* caseSensitive */true,
|
||||||
|
/* wholeWord */true, /* regExSearch */false);
|
||||||
|
document.replace(region.getOffset(), 1, "->"); //$NON-NLS-1$
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
marker.delete();
|
||||||
|
} catch (BadLocationException | CoreException e) {
|
||||||
|
CheckersUiActivator.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getColumnOffset(IMarker marker) {
|
||||||
|
// Get the column offset from the problem.variable attribute which is set for
|
||||||
|
// the generic C/C++ error message in cdt.core.
|
||||||
|
String offset = marker.getAttribute("problem.variable", "1:"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
if (offset.charAt(offset.length() - 1) == ':') {
|
||||||
|
String strToParse = offset.substring(0, offset.length() - 1);
|
||||||
|
return Integer.parseInt(strToParse) - 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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; singleton:=true
|
Bundle-SymbolicName: org.eclipse.cdt.codan.ui; singleton:=true
|
||||||
Bundle-Version: 3.2.0.qualifier
|
Bundle-Version: 3.2.1.qualifier
|
||||||
Bundle-Activator: org.eclipse.cdt.codan.internal.ui.CodanUIActivator
|
Bundle-Activator: org.eclipse.cdt.codan.internal.ui.CodanUIActivator
|
||||||
Bundle-Vendor: %Bundle-Vendor
|
Bundle-Vendor: %Bundle-Vendor
|
||||||
Require-Bundle: org.eclipse.cdt.codan.core,
|
Require-Bundle: org.eclipse.cdt.codan.core,
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<version>3.2.0-SNAPSHOT</version>
|
<version>3.2.1-SNAPSHOT</version>
|
||||||
<artifactId>org.eclipse.cdt.codan.ui</artifactId>
|
<artifactId>org.eclipse.cdt.codan.ui</artifactId>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -80,6 +80,9 @@ If this is not codan problem (for example gcc error), it can be ommitted. Messag
|
||||||
<documentation>
|
<documentation>
|
||||||
If problem id is not enought to identity the fix messagePattern can be used to apply fix for given message
|
If problem id is not enought to identity the fix messagePattern can be used to apply fix for given message
|
||||||
</documentation>
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute translatable="true"/>
|
||||||
|
</appinfo>
|
||||||
</annotation>
|
</annotation>
|
||||||
</attribute>
|
</attribute>
|
||||||
</complexType>
|
</complexType>
|
||||||
|
|
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: %pluginName
|
Bundle-Name: %pluginName
|
||||||
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
|
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
|
||||||
Bundle-Version: 6.3.0.qualifier
|
Bundle-Version: 6.3.1.qualifier
|
||||||
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
|
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
|
||||||
Bundle-Vendor: %providerName
|
Bundle-Vendor: %providerName
|
||||||
Bundle-Localization: plugin
|
Bundle-Localization: plugin
|
||||||
|
|
|
@ -169,7 +169,14 @@
|
||||||
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.WarningConflictingTypesFor" severity="Warning" variable-expr="$5"/>
|
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.WarningConflictingTypesFor" severity="Warning" variable-expr="$5"/>
|
||||||
<pattern description-expr="$5" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNULinkerErrorParser.regex.WarningDangerousFunction" severity="Warning" variable-expr="$6"/>
|
<pattern description-expr="$5" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNULinkerErrorParser.regex.WarningDangerousFunction" severity="Warning" variable-expr="$6"/>
|
||||||
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.InstantiatedFromHere" severity="Info"/>
|
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.InstantiatedFromHere" severity="Info"/>
|
||||||
<pattern description-expr="$7" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.GenericError" severity="Error"/>
|
<pattern
|
||||||
|
description-expr="$7"
|
||||||
|
eat-processed-line="true"
|
||||||
|
file-expr="$1"
|
||||||
|
line-expr="$2"
|
||||||
|
regex="%CDTGNUCErrorParser.regex.GenericError"
|
||||||
|
severity="Error"
|
||||||
|
variable-expr="$3"/>
|
||||||
<pattern description-expr="$7" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.GenericWarning" severity="Warning"/>
|
<pattern description-expr="$7" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.GenericWarning" severity="Warning"/>
|
||||||
<pattern description-expr="$9" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.GenericInfo" severity="Info"/>
|
<pattern description-expr="$9" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.GenericInfo" severity="Info"/>
|
||||||
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.OtherError" severity="Error"/>
|
<pattern description-expr="$4" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="%CDTGNUCErrorParser.regex.OtherError" severity="Error"/>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<version>6.3.0-SNAPSHOT</version>
|
<version>6.3.1-SNAPSHOT</version>
|
||||||
<artifactId>org.eclipse.cdt.core</artifactId>
|
<artifactId>org.eclipse.cdt.core</artifactId>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
</project>
|
</project>
|
||||||
|
|
Loading…
Add table
Reference in a new issue