mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-02 05:45:58 +02:00
Bug 317875: extended utility classes
This commit is contained in:
parent
081788d5df
commit
69016edc87
2 changed files with 135 additions and 1 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2009,2010 Alena Laskavaia
|
* Copyright (c) 2009, 2010 Alena Laskavaia, Tomasz Wesolowksi
|
||||||
* 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
|
||||||
|
@ -7,16 +7,33 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Alena Laskavaia - initial API and implementation
|
* Alena Laskavaia - initial API and implementation
|
||||||
|
* Tomasz Wesolowski - extension
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.codan.core.cxx;
|
package org.eclipse.cdt.codan.core.cxx;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
|
import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
|
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.INodeFactory;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
|
import org.eclipse.cdt.core.dom.rewrite.DeclarationGenerator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful functions for doing code analysis on c/c++ AST
|
* Useful functions for doing code analysis on c/c++ AST
|
||||||
|
@ -63,4 +80,64 @@ public final class CxxAstUtils {
|
||||||
fileLocation.getNodeLength());
|
fileLocation.getNodeLength());
|
||||||
return macro != null;
|
return macro != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IASTFunctionDefinition getEnclosingFunction(IASTNode node) {
|
||||||
|
while (node != null && !(node instanceof IASTFunctionDefinition)) {
|
||||||
|
node = node.getParent();
|
||||||
|
}
|
||||||
|
return (IASTFunctionDefinition) node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTCompositeTypeSpecifier getEnclosingCompositeTypeSpecifier(IASTNode node) {
|
||||||
|
while (node != null && !(node instanceof IASTCompositeTypeSpecifier)) {
|
||||||
|
node = node.getParent();
|
||||||
|
}
|
||||||
|
return (IASTCompositeTypeSpecifier) node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTStatement getEnclosingStatement(IASTNode node) {
|
||||||
|
while (node != null && !(node instanceof IASTStatement)) {
|
||||||
|
node = node.getParent();
|
||||||
|
}
|
||||||
|
return (IASTStatement) node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param astName a name for the declaration
|
||||||
|
* @param factory the factory
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public IASTDeclaration createDeclaration(IASTName astName, INodeFactory factory) {
|
||||||
|
IASTSimpleDeclaration declaration = factory.newSimpleDeclaration(null);
|
||||||
|
|
||||||
|
IASTDeclarator declarator = factory.newDeclarator(astName.copy());
|
||||||
|
IASTDeclSpecifier declspec = factory.newSimpleDeclSpecifier();
|
||||||
|
((IASTSimpleDeclSpecifier)declspec).setType(Kind.eVoid);
|
||||||
|
|
||||||
|
if (astName.getParent() instanceof IASTIdExpression
|
||||||
|
&& astName.getParent().getParent() instanceof IASTBinaryExpression
|
||||||
|
&& ((IASTBinaryExpression) astName.getParent().getParent())
|
||||||
|
.getOperator() == IASTBinaryExpression.op_assign
|
||||||
|
&& astName.getParent().getParent().getParent() instanceof IASTExpressionStatement) {
|
||||||
|
IASTNode binaryExpr = astName.getParent().getParent();
|
||||||
|
IASTExpression tgt = null;
|
||||||
|
for (IASTNode node : binaryExpr.getChildren()) {
|
||||||
|
if (node != astName.getParent()) {
|
||||||
|
// use this expression as type source
|
||||||
|
tgt = (IASTExpression) node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tgt != null) {
|
||||||
|
DeclarationGenerator generator = DeclarationGenerator.create(factory);
|
||||||
|
IType type = tgt.getExpressionType();
|
||||||
|
declarator = generator.createDeclaratorFromType(type, astName.toCharArray());
|
||||||
|
declspec = generator.createDeclSpecFromType(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declaration.setDeclSpecifier(declspec);
|
||||||
|
declaration.addDeclarator(declarator);
|
||||||
|
return declaration;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2010 Tomasz Wesolowski
|
||||||
|
* 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:
|
||||||
|
* Tomasz Wesolowski - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.ui;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.ITextViewer;
|
||||||
|
import org.eclipse.jface.text.link.LinkedModeModel;
|
||||||
|
import org.eclipse.jface.text.link.LinkedModeUI;
|
||||||
|
import org.eclipse.jface.text.link.LinkedPosition;
|
||||||
|
import org.eclipse.jface.text.link.LinkedPositionGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Collection of utils methods for location/text manipulations
|
||||||
|
*
|
||||||
|
* @noinstantiate This class is not intended to be instantiated by clients.
|
||||||
|
* @since 1.1
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class JFaceTextUtils {
|
||||||
|
/**
|
||||||
|
* Enters the linked mode and creates a singular LinkedPosition around a
|
||||||
|
* given IASTFileLocation in a given Document.
|
||||||
|
*
|
||||||
|
* @param location
|
||||||
|
* the location to wrap
|
||||||
|
* @param document
|
||||||
|
* the document to use
|
||||||
|
*/
|
||||||
|
public static void markLocationForInsert(IASTFileLocation location,
|
||||||
|
ITextViewer viewer) {
|
||||||
|
IDocument document = viewer.getDocument();
|
||||||
|
LinkedPosition pos = new LinkedPosition(document,
|
||||||
|
location.getNodeOffset(), location.getNodeLength());
|
||||||
|
LinkedModeModel model = new LinkedModeModel();
|
||||||
|
LinkedPositionGroup group = new LinkedPositionGroup();
|
||||||
|
try {
|
||||||
|
group.addPosition(pos);
|
||||||
|
model.addGroup(group);
|
||||||
|
model.forceInstall();
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LinkedModeUI ui = new LinkedModeUI(model, new ITextViewer[] { viewer });
|
||||||
|
ui.enter();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue