1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-09 17:25:38 +02:00

Merge branch 'master' into sd90

This commit is contained in:
Andrew Gvozdev 2013-02-01 10:29:42 -05:00
commit 383cb93e57
122 changed files with 3581 additions and 1483 deletions

View file

@ -35,7 +35,7 @@ import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.tests.ast2.AST2BaseTest; import org.eclipse.cdt.core.parser.tests.ast2.AST2TestBase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
@ -83,7 +83,7 @@ public abstract class CodanFastCxxAstTestCase extends TestCase {
protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean gcc) { protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean gcc) {
FileContent codeReader = FileContent.create("code.c", code.toCharArray()); FileContent codeReader = FileContent.create("code.c", code.toCharArray());
IScannerInfo scannerInfo = new ScannerInfo(); IScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner = AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner = AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
if (lang == ParserLanguage.CPP) { if (lang == ParserLanguage.CPP) {
ICPPParserExtensionConfiguration config = null; ICPPParserExtensionConfiguration config = null;

View file

@ -8,10 +8,6 @@
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
*******************************************************************************/ *******************************************************************************/
/*
* Created on Sept 28, 2004
*/
package org.eclipse.cdt.core.parser.tests; package org.eclipse.cdt.core.parser.tests;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -36,127 +32,110 @@ import org.eclipse.core.runtime.NullProgressMonitor;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class FileBasePluginTest extends TestCase { public class FileBasePluginTestCase extends TestCase {
static NullProgressMonitor monitor; static NullProgressMonitor monitor;
static IWorkspace workspace; static IWorkspace workspace;
static IProject project; static IProject project;
static FileManager fileManager; static FileManager fileManager;
static int numProjects = 0; static int numProjects;
static Class className; static Class className;
static ICProject cPrj; static ICProject cPrj;
public FileBasePluginTest() { public FileBasePluginTestCase() {
} }
public FileBasePluginTest(String name) { public FileBasePluginTestCase(String name) {
super(name); super(name);
} }
private void initialize(Class aClassName){ private void initialize(Class aClassName) {
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){ if (CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null) {
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset(); //(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace(); workspace = ResourcesPlugin.getWorkspace();
try { try {
cPrj = CProjectHelper.createCCProject("ParserTestProject", "bin", IPDOMManager.ID_NO_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$ cPrj = CProjectHelper.createCCProject("ParserTestProject", "bin", IPDOMManager.ID_NO_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject(); project = cPrj.getProject();
// ugly // ugly
if (className == null || !className.equals(aClassName)) { if (className == null || !className.equals(aClassName)) {
className = aClassName; className = aClassName;
numProjects++; numProjects++;
} }
} catch ( CoreException e ) { } catch (CoreException e) {
/*boo*/ // Ignore
} }
if (project == null) if (project == null)
throw new NullPointerException("Unable to create project"); //$NON-NLS-1$ throw new NullPointerException("Unable to create project"); //$NON-NLS-1$
//Create file manager //Create file manager
fileManager = new FileManager(); fileManager = new FileManager();
} }
} }
public FileBasePluginTest(String name, Class className) public FileBasePluginTestCase(String name, Class className) {
{
super(name); super(name);
initialize(className); initialize(className);
} }
public void cleanupProject() throws Exception { public void cleanupProject() throws Exception {
numProjects--; numProjects--;
try{ try {
if (numProjects == 0) { if (numProjects == 0) {
project.delete( true, false, monitor ); project.delete(true, false, monitor);
project = null; project = null;
} }
} catch( Throwable e ){ } catch (Throwable e) {
/*boo*/ // Ignore
} }
} }
@Override @Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
if( project == null || !project.exists() ) if (project == null || !project.exists())
return; return;
IResource [] members = project.members(); IResource [] members = project.members();
for( int i = 0; i < members.length; i++ ){ for (int i = 0; i < members.length; i++) {
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$ if (members[i].getName().equals(".project") || members[i].getName().equals(".cproject")) //$NON-NLS-1$ //$NON-NLS-2$
continue; continue;
if (members[i].getName().equals(".settings")) if (members[i].getName().equals(".settings"))
continue; continue;
try{ try {
members[i].delete( false, monitor ); members[i].delete(false, monitor);
} catch( Throwable e ){ } catch (Throwable e) {
/*boo*/ // Ignore
} }
} }
} }
// below can be used to work with large files (too large for memory)
// protected IFile importFile(String fileName) throws Exception {
// IFile file = cPrj.getProject().getFile(fileName);
// if (!file.exists()) {
// try{
// FileInputStream fileIn = new FileInputStream(
// CTestPlugin.getDefault().getFileInPlugin(new Path("resources/parser/" + fileName)));
// file.create(fileIn,false, monitor);
// } catch (CoreException e) {
// e.printStackTrace();
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
// }
//
// return file;
// }
protected IFolder importFolder(String folderName) throws Exception { protected IFolder importFolder(String folderName) throws Exception {
IFolder folder = project.getProject().getFolder(folderName); IFolder folder = project.getProject().getFolder(folderName);
//Create file input stream // Create file input stream
if( !folder.exists() ) if (!folder.exists())
folder.create( false, false, monitor ); folder.create(false, false, monitor);
return folder; return folder;
} }
public IFile importFile(String fileName, String contents ) throws Exception{
//Obtain file handle public IFile importFile(String fileName, String contents) throws Exception {
// Obtain file handle
IFile file = project.getProject().getFile(fileName); IFile file = project.getProject().getFile(fileName);
InputStream stream = new ByteArrayInputStream( contents.getBytes() ); InputStream stream = new ByteArrayInputStream(contents.getBytes());
//Create file input stream // Create file input stream
if( file.exists() ) if (file.exists()) {
file.setContents( stream, false, false, monitor ); file.setContents(stream, false, false, monitor);
else } else {
file.create( stream, false, monitor ); file.create(stream, false, monitor);
}
fileManager.addFile(file); fileManager.addFile(file);
return file; return file;
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009, 2010 IBM Corporation and others. * Copyright (c) 2009, 2013 IBM Corporation 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
@ -9,6 +9,7 @@
* Mike Kucera (IBM) * Mike Kucera (IBM)
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
@ -28,19 +29,19 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* Tests for classes implementing IASTImplicitNameOwner interface. * Tests for classes implementing IASTImplicitNameOwner interface.
*/ */
public class AST2CPPImplicitNameTests extends AST2BaseTest { public class AST2CPPImplicitNameTests extends AST2TestBase {
public AST2CPPImplicitNameTests() { public AST2CPPImplicitNameTests() {
} }
public AST2CPPImplicitNameTests(String name) { public AST2CPPImplicitNameTests(String name) {
super(name); super(name);
} }
public static TestSuite suite() { public static TestSuite suite() {
return suite(AST2CPPImplicitNameTests.class); return suite(AST2CPPImplicitNameTests.class);
} }
public IASTImplicitName[] getImplicitNames(IASTTranslationUnit tu, String contents, String section, int len) { public IASTImplicitName[] getImplicitNames(IASTTranslationUnit tu, String contents, String section, int len) {
final int offset = contents.indexOf(section); final int offset = contents.indexOf(section);
assertTrue(offset >= 0); assertTrue(offset >= 0);
@ -75,25 +76,25 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
IASTImplicitName n; IASTImplicitName n;
n = ba.assertImplicitName("+= 5", 2, ICPPMethod.class); n = ba.assertImplicitName("+= 5", 2, ICPPMethod.class);
assertSame(n.resolveBinding(), col.getName(14).resolveBinding()); assertSame(n.resolveBinding(), col.getName(14).resolveBinding());
n = ba.assertImplicitName("+ p", 1, ICPPMethod.class); n = ba.assertImplicitName("+ p", 1, ICPPMethod.class);
assertSame(n.resolveBinding(), col.getName(4).resolveBinding()); assertSame(n.resolveBinding(), col.getName(4).resolveBinding());
n = ba.assertImplicitName("- p", 1, ICPPMethod.class); n = ba.assertImplicitName("- p", 1, ICPPMethod.class);
assertSame(n.resolveBinding(), col.getName(8).resolveBinding()); assertSame(n.resolveBinding(), col.getName(8).resolveBinding());
n = ba.assertImplicitName("* p", 1, ICPPFunction.class); n = ba.assertImplicitName("* p", 1, ICPPFunction.class);
assertSame(n.resolveBinding(), col.getName(17).resolveBinding()); assertSame(n.resolveBinding(), col.getName(17).resolveBinding());
n = ba.assertImplicitName("/ p", 1, ICPPFunction.class); n = ba.assertImplicitName("/ p", 1, ICPPFunction.class);
assertSame(n.resolveBinding(), col.getName(23).resolveBinding()); assertSame(n.resolveBinding(), col.getName(23).resolveBinding());
n = ba.assertImplicitName("-p;", 1, ICPPMethod.class); n = ba.assertImplicitName("-p;", 1, ICPPMethod.class);
assertSame(n.resolveBinding(), col.getName(12).resolveBinding()); assertSame(n.resolveBinding(), col.getName(12).resolveBinding());
ba.assertNoImplicitName("<< 6", 2); ba.assertNoImplicitName("<< 6", 2);
ba.assertNoImplicitName("+p;", 1); ba.assertNoImplicitName("+p;", 1);
} }
@ -136,9 +137,9 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
ba.assertNoImplicitName("&Y::x;", 1); ba.assertNoImplicitName("&Y::x;", 1);
IASTImplicitName n = ba.assertImplicitName("&y;", 1, ICPPFunction.class); IASTImplicitName n = ba.assertImplicitName("&y;", 1, ICPPFunction.class);
assertSame(n.resolveBinding(), col.getName(9).resolveBinding()); assertSame(n.resolveBinding(), col.getName(9).resolveBinding());
} }
@ -165,20 +166,20 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
// p2->doA(); // p2->doA();
// } // }
public void testArrowOperator() throws Exception { public void testArrowOperator() throws Exception {
String contents = getAboveComment(); String contents = getAboveComment();
IASTTranslationUnit tu = parse(contents, ParserLanguage.CPP); IASTTranslationUnit tu = parse(contents, ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
IASTImplicitName[] implicits = getImplicitNames(tu, contents, "->doA();", 2); IASTImplicitName[] implicits = getImplicitNames(tu, contents, "->doA();", 2);
assertNotNull(implicits); assertNotNull(implicits);
assertEquals(2, implicits.length); assertEquals(2, implicits.length);
assertSame(implicits[1].getBinding(), col.getName(4).resolveBinding()); assertSame(implicits[1].getBinding(), col.getName(4).resolveBinding());
assertSame(implicits[0].getBinding(), col.getName(12).resolveBinding()); assertSame(implicits[0].getBinding(), col.getName(12).resolveBinding());
} }
// struct A { // struct A {
// int x; // int x;
// }; // };
@ -224,15 +225,15 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
ba.assertNoImplicitName(", b, c, d); // func", 1); ba.assertNoImplicitName(", b, c, d); // func", 1);
ba.assertNoImplicitName(", c, d); // func", 1); ba.assertNoImplicitName(", c, d); // func", 1);
ba.assertNoImplicitName(", d); // func", 1); ba.assertNoImplicitName(", d); // func", 1);
IASTImplicitName opAB = ba.assertImplicitName(", b, c, d; // expr", 1, ICPPFunction.class); IASTImplicitName opAB = ba.assertImplicitName(", b, c, d; // expr", 1, ICPPFunction.class);
IASTImplicitName opCC = ba.assertImplicitName(", c, d; // expr", 1, ICPPFunction.class); IASTImplicitName opCC = ba.assertImplicitName(", c, d; // expr", 1, ICPPFunction.class);
ba.assertNoImplicitName(", d; // expr", 1); ba.assertNoImplicitName(", d; // expr", 1);
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
assertSame(opAB.resolveBinding(), col.getName(5).resolveBinding()); assertSame(opAB.resolveBinding(), col.getName(5).resolveBinding());
assertSame(opCC.resolveBinding(), col.getName(11).resolveBinding()); assertSame(opCC.resolveBinding(), col.getName(11).resolveBinding());
} }
@ -255,20 +256,20 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
// } // }
public void testCommaOperator2() throws Exception { public void testCommaOperator2() throws Exception {
BindingAssertionHelper ba = new BindingAssertionHelper(getAboveComment(), true); BindingAssertionHelper ba = new BindingAssertionHelper(getAboveComment(), true);
IASTImplicitName opAB = ba.assertImplicitName(", b, c, d", 1, ICPPMethod.class); IASTImplicitName opAB = ba.assertImplicitName(", b, c, d", 1, ICPPMethod.class);
IASTImplicitName opCC = ba.assertImplicitName(", c, d", 1, ICPPFunction.class); IASTImplicitName opCC = ba.assertImplicitName(", c, d", 1, ICPPFunction.class);
IASTImplicitName opDD = ba.assertImplicitName(", d", 1, ICPPMethod.class); IASTImplicitName opDD = ba.assertImplicitName(", d", 1, ICPPMethod.class);
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
// 6, 11, 15 // 6, 11, 15
assertSame(opAB.resolveBinding(), col.getName(6).resolveBinding()); assertSame(opAB.resolveBinding(), col.getName(6).resolveBinding());
assertSame(opCC.resolveBinding(), col.getName(15).resolveBinding()); assertSame(opCC.resolveBinding(), col.getName(15).resolveBinding());
assertSame(opDD.resolveBinding(), col.getName(11).resolveBinding()); assertSame(opDD.resolveBinding(), col.getName(11).resolveBinding());
ba.assertNonProblem("ee;", 2); ba.assertNonProblem("ee;", 2);
} }
@ -289,7 +290,7 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
IASTImplicitName n1 = ba.assertImplicitName("(b); // 1", 1, ICPPMethod.class); IASTImplicitName n1 = ba.assertImplicitName("(b); // 1", 1, ICPPMethod.class);
IASTImplicitName n2 = ba.assertImplicitName("); // 1", 1, ICPPMethod.class); IASTImplicitName n2 = ba.assertImplicitName("); // 1", 1, ICPPMethod.class);
assertSame(n1.resolveBinding(), n2.resolveBinding()); assertSame(n1.resolveBinding(), n2.resolveBinding());
@ -298,14 +299,14 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
// there should be no overlap // there should be no overlap
ba.assertNoImplicitName("b); // 1", 1); ba.assertNoImplicitName("b); // 1", 1);
assertSame(col.getName(1).resolveBinding(), n1.resolveBinding()); assertSame(col.getName(1).resolveBinding(), n1.resolveBinding());
n1 = ba.assertImplicitName("(); // 2", 1, ICPPMethod.class); n1 = ba.assertImplicitName("(); // 2", 1, ICPPMethod.class);
n2 = ba.assertImplicitName("); // 2", 1, ICPPMethod.class); n2 = ba.assertImplicitName("); // 2", 1, ICPPMethod.class);
assertSame(n1.resolveBinding(), n2.resolveBinding()); assertSame(n1.resolveBinding(), n2.resolveBinding());
assertFalse(n1.isAlternate()); assertFalse(n1.isAlternate());
assertTrue(n2.isAlternate()); assertTrue(n2.isAlternate());
assertSame(col.getName(3).resolveBinding(), n1.resolveBinding()); assertSame(col.getName(3).resolveBinding(), n1.resolveBinding());
n1 = ba.assertImplicitName("(1, 2); // 3", 1, ICPPMethod.class); n1 = ba.assertImplicitName("(1, 2); // 3", 1, ICPPMethod.class);
n2 = ba.assertImplicitName("); // 3", 1, ICPPMethod.class); n2 = ba.assertImplicitName("); // 3", 1, ICPPMethod.class);
assertSame(n1.resolveBinding(), n2.resolveBinding()); assertSame(n1.resolveBinding(), n2.resolveBinding());
@ -348,7 +349,7 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
IASTImplicitName n1 = ba.assertImplicitName("[0]); //1", 1, ICPPMethod.class); IASTImplicitName n1 = ba.assertImplicitName("[0]); //1", 1, ICPPMethod.class);
ba.assertNoImplicitName("0]); //1", 1); ba.assertNoImplicitName("0]); //1", 1);
IASTImplicitName n2 = ba.assertImplicitName("]); //1", 1, ICPPMethod.class); IASTImplicitName n2 = ba.assertImplicitName("]); //1", 1, ICPPMethod.class);
@ -356,7 +357,7 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
assertFalse(n1.isAlternate()); assertFalse(n1.isAlternate());
assertTrue(n2.isAlternate()); assertTrue(n2.isAlternate());
assertSame(col.getName(1).resolveBinding(), n1.resolveBinding()); assertSame(col.getName(1).resolveBinding(), n1.resolveBinding());
n1 = ba.assertImplicitName("[q]); //2", 1, ICPPMethod.class); n1 = ba.assertImplicitName("[q]); //2", 1, ICPPMethod.class);
ba.assertNoImplicitName("q]); //2", 1); ba.assertNoImplicitName("q]); //2", 1);
n2 = ba.assertImplicitName("]); //2", 1, ICPPMethod.class); n2 = ba.assertImplicitName("]); //2", 1, ICPPMethod.class);
@ -384,21 +385,21 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
assertEquals(2, names.length); assertEquals(2, names.length);
IASTImplicitName destructor = names[0]; IASTImplicitName destructor = names[0];
IASTImplicitName delete = names[1]; IASTImplicitName delete = names[1];
IASTTranslationUnit tu = ba.getTranslationUnit(); IASTTranslationUnit tu = ba.getTranslationUnit();
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
assertSame(col.getName(1).resolveBinding(), destructor.resolveBinding()); assertSame(col.getName(1).resolveBinding(), destructor.resolveBinding());
assertSame(col.getName(2).resolveBinding(), delete.resolveBinding()); assertSame(col.getName(2).resolveBinding(), delete.resolveBinding());
names = ba.getImplicitNames("delete[] x;", 6); names = ba.getImplicitNames("delete[] x;", 6);
assertEquals(1, names.length); assertEquals(1, names.length);
assertSame(col.getName(4).resolveBinding(), names[0].resolveBinding()); assertSame(col.getName(4).resolveBinding(), names[0].resolveBinding());
ba.assertNoImplicitName("delete 1;", 6); ba.assertNoImplicitName("delete 1;", 6);
} }
// struct A { // struct A {
// void operator delete(void * a); // void operator delete(void * a);
// }; // };
@ -416,15 +417,15 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
IBinding m= bh.assertNonProblem("operator delete(void * a)", 15); IBinding m= bh.assertNonProblem("operator delete(void * a)", 15);
IBinding f= bh.assertNonProblem("operator delete(void * b)", 15); IBinding f= bh.assertNonProblem("operator delete(void * b)", 15);
IASTImplicitName[] names = bh.getImplicitNames("delete a;", 6); IASTImplicitName[] names = bh.getImplicitNames("delete a;", 6);
assertEquals(2, names.length); assertEquals(2, names.length);
assertTrue(((ICPPMethod) names[0].resolveBinding()).isDestructor()); assertTrue(((ICPPMethod) names[0].resolveBinding()).isDestructor());
assertSame(m, names[1].resolveBinding()); assertSame(m, names[1].resolveBinding());
names = bh.getImplicitNames("delete b;", 6); names = bh.getImplicitNames("delete b;", 6);
assertTrue(((ICPPMethod) names[0].resolveBinding()).isDestructor()); assertTrue(((ICPPMethod) names[0].resolveBinding()).isDestructor());
assertEquals(2, names.length); assertEquals(2, names.length);
assertSame(f, names[1].resolveBinding()); assertSame(f, names[1].resolveBinding());
} }
@ -443,13 +444,13 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true); BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
IBinding m= bh.assertNonProblem("operator new(size_t a)", 12); IBinding m= bh.assertNonProblem("operator new(size_t a)", 12);
IBinding f= bh.assertNonProblem("operator new(size_t b)", 12); IBinding f= bh.assertNonProblem("operator new(size_t b)", 12);
IASTImplicitName[] names = bh.getImplicitNames("new A;", 3); IASTImplicitName[] names = bh.getImplicitNames("new A;", 3);
assertEquals(1, names.length); assertEquals(2, names.length);
assertSame(m, names[0].resolveBinding()); assertSame(m, names[0].resolveBinding());
names = bh.getImplicitNames("new B;", 3); names = bh.getImplicitNames("new B;", 3);
assertEquals(1, names.length); assertEquals(2, names.length);
assertSame(f, names[0].resolveBinding()); assertSame(f, names[0].resolveBinding());
} }
@ -461,9 +462,9 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
public void testImplicitNewAndDelete() throws Exception { public void testImplicitNewAndDelete() throws Exception {
BindingAssertionHelper ba = new BindingAssertionHelper(getAboveComment(), true); BindingAssertionHelper ba = new BindingAssertionHelper(getAboveComment(), true);
ba.assertNoImplicitName("new X", 3); ba.assertNoImplicitName("new X", 3);
ba.assertNoImplicitName("delete[]", 6); ba.assertNoImplicitName("delete[]", 6);
} }
// typedef long unsigned int size_t // typedef long unsigned int size_t
// struct nothrow_t {}; // struct nothrow_t {};
// extern const nothrow_t nothrow; // extern const nothrow_t nothrow;
@ -491,7 +492,7 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
assertSame(col.getName(9).resolveBinding(), n2.resolveBinding()); assertSame(col.getName(9).resolveBinding(), n2.resolveBinding());
assertSame(col.getName(14).resolveBinding(), n3.resolveBinding()); assertSame(col.getName(14).resolveBinding(), n3.resolveBinding());
} }
// int test() { // int test() {
// throw; // throw;
// } // }
@ -551,7 +552,7 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
IASTImplicitName v = ba.assertImplicitName("v(p)", 1, ICPPConstructor.class); IASTImplicitName v = ba.assertImplicitName("v(p)", 1, ICPPConstructor.class);
assertSame(ctor1, v.resolveBinding()); assertSame(ctor1, v.resolveBinding());
} }
// enum A {aa}; // enum A {aa};
// struct B{ operator A();}; // struct B{ operator A();};
// bool operator==(A, A); // overrides the built-in operator. // bool operator==(A, A); // overrides the built-in operator.
@ -567,5 +568,5 @@ public class AST2CPPImplicitNameTests extends AST2BaseTest {
ICPPFunction op = ba.assertNonProblem("operator==", 0); ICPPFunction op = ba.assertNonProblem("operator==", 0);
IASTImplicitName a = ba.assertImplicitName("==b", 2, ICPPFunction.class); IASTImplicitName a = ba.assertImplicitName("==b", 2, ICPPFunction.class);
assertSame(op, a.resolveBinding()); assertSame(op, a.resolveBinding());
} }
} }

View file

@ -46,7 +46,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/** /**
* Examples taken from the c++-specification. * Examples taken from the c++-specification.
*/ */
public class AST2CPPSpecTest extends AST2SpecBaseTest { public class AST2CPPSpecTest extends AST2SpecTestBase {
public AST2CPPSpecTest() { public AST2CPPSpecTest() {
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2012 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
@ -128,6 +128,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod;
@ -139,7 +140,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil;
import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ParserException;
public class AST2CPPTests extends AST2BaseTest { public class AST2CPPTests extends AST2TestBase {
public AST2CPPTests() { public AST2CPPTests() {
} }
@ -260,7 +261,7 @@ public class AST2CPPTests extends AST2BaseTest {
assertEquals(declNames.length, i); assertEquals(declNames.length, i);
assertEquals(defNames.length, j); assertEquals(defNames.length, j);
} }
@Override @Override
protected void assertSameType(IType first, IType second){ protected void assertSameType(IType first, IType second){
assertNotNull(first); assertNotNull(first);
@ -1201,10 +1202,10 @@ public class AST2CPPTests extends AST2BaseTest {
// } // }
public void testVirtualParentLookup() throws Exception { public void testVirtualParentLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector(); CPPNameCollector collector = new CPPNameCollector(true);
tu.accept(collector); tu.accept(collector);
assertEquals(collector.size(), 15); assertEquals(collector.size(), 16);
ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding(); ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding();
ICPPField x = (ICPPField) collector.getName(1).resolveBinding(); ICPPField x = (ICPPField) collector.getName(1).resolveBinding();
@ -1215,7 +1216,7 @@ public class AST2CPPTests extends AST2BaseTest {
assertInstances(collector, D, 3); assertInstances(collector, D, 3);
assertInstances(collector, C, 2); assertInstances(collector, C, 2);
assertInstances(collector, B, 2); assertInstances(collector, B, 2);
assertInstances(collector, A, 2); assertInstances(collector, A, 3);
assertInstances(collector, ctor, 1); assertInstances(collector, ctor, 1);
assertInstances(collector, x, 2); assertInstances(collector, x, 2);
} }
@ -1230,10 +1231,10 @@ public class AST2CPPTests extends AST2BaseTest {
// } // }
public void testAmbiguousVirtualParentLookup() throws Exception { public void testAmbiguousVirtualParentLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector(); CPPNameCollector collector = new CPPNameCollector(true);
tu.accept(collector); tu.accept(collector);
assertEquals(collector.size(), 15); assertEquals(collector.size(), 16);
ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding(); ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding();
ICPPField x1 = (ICPPField) collector.getName(1).resolveBinding(); ICPPField x1 = (ICPPField) collector.getName(1).resolveBinding();
@ -1241,13 +1242,13 @@ public class AST2CPPTests extends AST2BaseTest {
ICPPClassType B = (ICPPClassType) collector.getName(4).resolveBinding(); ICPPClassType B = (ICPPClassType) collector.getName(4).resolveBinding();
ICPPClassType A = (ICPPClassType) collector.getName(6).resolveBinding(); ICPPClassType A = (ICPPClassType) collector.getName(6).resolveBinding();
ICPPConstructor ctor = A.getConstructors()[0]; ICPPConstructor ctor = A.getConstructors()[0];
IProblemBinding x2 = (IProblemBinding) collector.getName(14).resolveBinding(); IProblemBinding x2 = (IProblemBinding) collector.getName(15).resolveBinding();
assertEquals(x2.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP); assertEquals(x2.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP);
assertInstances(collector, D, 3); assertInstances(collector, D, 3);
assertInstances(collector, C, 2); assertInstances(collector, C, 2);
assertInstances(collector, B, 2); assertInstances(collector, B, 2);
assertInstances(collector, A, 2); assertInstances(collector, A, 3);
assertInstances(collector, ctor, 1); assertInstances(collector, ctor, 1);
assertInstances(collector, x1, 1); assertInstances(collector, x1, 1);
} }
@ -1843,7 +1844,7 @@ public class AST2CPPTests extends AST2BaseTest {
ICPPMethod dtor = (ICPPMethod) col.getName(13).resolveBinding(); ICPPMethod dtor = (ICPPMethod) col.getName(13).resolveBinding();
assertNotNull(dtor); assertNotNull(dtor);
assertEquals(dtor.getName(), "~C"); //$NON-NLS-1$ assertEquals(dtor.getName(), "~C"); //$NON-NLS-1$
assertInstances(col, C, 6); assertInstances(col, C, 7);
assertInstances(col, op, 3); assertInstances(col, op, 3);
assertInstances(col, other, 4); assertInstances(col, other, 4);
@ -1993,7 +1994,7 @@ public class AST2CPPTests extends AST2BaseTest {
assertInstances(col, pb, 2); assertInstances(col, pb, 2);
assertInstances(col, mutate, 2); assertInstances(col, mutate, 2);
assertInstances(col, B, 2); assertInstances(col, B, 3);
} }
// struct S { int i; }; // struct S { int i; };
@ -2511,7 +2512,7 @@ public class AST2CPPTests extends AST2BaseTest {
// } // }
public void testBug86267() throws Exception { public void testBug86267() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
ICPPClassType D1 = (ICPPClassType) col.getName(2).resolveBinding(); ICPPClassType D1 = (ICPPClassType) col.getName(2).resolveBinding();
@ -2549,7 +2550,7 @@ public class AST2CPPTests extends AST2BaseTest {
ICPPMethod op = (ICPPMethod) col.getName(3).resolveBinding(); ICPPMethod op = (ICPPMethod) col.getName(3).resolveBinding();
IParameter other = (IParameter) col.getName(5).resolveBinding(); IParameter other = (IParameter) col.getName(5).resolveBinding();
assertInstances(col, C, 6); assertInstances(col, C, 7);
assertInstances(col, f, 2); assertInstances(col, f, 2);
assertInstances(col, op, 3); assertInstances(col, op, 3);
assertInstances(col, other, 4); assertInstances(col, other, 4);
@ -4052,11 +4053,11 @@ public class AST2CPPTests extends AST2BaseTest {
// X x = new X(y); // X x = new X(y);
public void testBug90654_1() throws Exception { public void testBug90654_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP); IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
ICPPConstructor ctor1 = (ICPPConstructor) col.getName(1).resolveBinding(); ICPPConstructor ctor1 = (ICPPConstructor) col.getName(1).resolveBinding();
ICPPConstructor ctor = (ICPPConstructor) col.getName(11).resolveBinding(); ICPPConstructor ctor = (ICPPConstructor) col.getName(12).resolveBinding();
assertSame(ctor, ctor1); assertSame(ctor, ctor1);
} }
@ -8382,20 +8383,24 @@ public class AST2CPPTests extends AST2BaseTest {
// fH({1}); // H(G(1)) // fH({1}); // H(G(1))
// } // }
public void testListInitialization_302412f() throws Exception { public void testListInitialization_302412f() throws Exception {
ICPPConstructor ctor;
IProblemBinding problem; IProblemBinding problem;
String code= getAboveComment(); String code= getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true); BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
bh.assertProblem("f({1,1})", 1); bh.assertProblem("f({1,1})", 1);
ctor= bh.assertNonProblem("F({1,1})", 1); bh.assertImplicitName("F({1,1})", 1, ICPPConstructor.class);
bh.assertNonProblem("fF({1,1})", 2); bh.assertNonProblem("fF({1,1})", 2);
bh.assertNonProblem("fG(1)", 2); bh.assertNonProblem("fG(1)", 2);
bh.assertNonProblem("fG({1})", 2); bh.assertNonProblem("fG({1})", 2);
ctor= bh.assertNonProblem("H(1)", 1); bh.assertImplicitName("H(1)", 1, ICPPConstructor.class);
problem= bh.assertProblem("H({1})", 1); bh.assertNoImplicitName("H({1})", 1);
assertEquals(IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, problem.getID()); // TODO(nathanridge): Perhaps we should store implicit names even if they
// resolve to ProblemBindings. Then we can do the stronger check in the
// 3 commented lines below.
//IASTImplicitName n= bh.assertImplicitName("H({1})", 1, IProblemBinding.class);
//problem= (IProblemBinding) n.resolveBinding();
//assertEquals(IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, problem.getID());
bh.assertProblem("fH(1)", 2); bh.assertProblem("fH(1)", 2);
bh.assertNonProblem("fH({1})", 2); bh.assertNonProblem("fH({1})", 2);
} }
@ -9823,7 +9828,7 @@ public class AST2CPPTests extends AST2BaseTest {
} }
// struct Base { // struct Base {
// virtual void mFuncDecl(); // virtual void mFuncDecl();
// virtual void mFuncDef(){} // virtual void mFuncDef(){}
// }; // };
// struct S : public Base { // struct S : public Base {
@ -9851,9 +9856,9 @@ public class AST2CPPTests extends AST2BaseTest {
assertInstance(declarator, ICPPASTFunctionDeclarator.class); assertInstance(declarator, ICPPASTFunctionDeclarator.class);
assertVirtualSpecifiers((ICPPASTFunctionDeclarator)declarator, true, false); assertVirtualSpecifiers((ICPPASTFunctionDeclarator)declarator, true, false);
} }
// struct Base { // struct Base {
// virtual void mFuncDecl(); // virtual void mFuncDecl();
// virtual void mFuncDef(){} // virtual void mFuncDef(){}
// }; // };
// struct S : public Base { // struct S : public Base {
@ -10025,7 +10030,7 @@ public class AST2CPPTests extends AST2BaseTest {
// double vdouble; // double vdouble;
// long double vlongdouble; // long double vlongdouble;
// UnscopedEnum vue; // UnscopedEnum vue;
// //
// // Narrowing conversions // // Narrowing conversions
// fint({vdouble}); // fint({vdouble});
// ffloat({vlongdouble}); // ffloat({vlongdouble});
@ -10083,7 +10088,7 @@ public class AST2CPPTests extends AST2BaseTest {
helper.assertNonProblemOnFirstIdentifier("fint({vbool"); helper.assertNonProblemOnFirstIdentifier("fint({vbool");
helper.assertNonProblemOnFirstIdentifier("fint({vchar"); helper.assertNonProblemOnFirstIdentifier("fint({vchar");
} }
// namespace std { // namespace std {
// struct string {}; // struct string {};
// struct exception {}; // struct exception {};
@ -10121,4 +10126,64 @@ public class AST2CPPTests extends AST2BaseTest {
parseAndCheckBindings(getAboveComment(), CPP, true); parseAndCheckBindings(getAboveComment(), CPP, true);
} }
// template <typename T>
// T bar();
// struct S {
// void waldo();
// };
// int main() {
// auto L = [](S s) { return s; };
// typedef decltype(L) lambda_type;
// decltype(bar<const lambda_type>()(S())) v;
// v.waldo();
// }
public void testDecltypeWithConstantLambda_397494() throws Exception {
parseAndCheckBindings();
}
// template <bool>
// struct enable_if {
// };
// template <>
// struct enable_if<true> {
// typedef void type;
// };
// struct base {};
// struct derived : base {};
// typedef enable_if<__is_base_of(base, derived)>::type T;
public void testIsBaseOf_399353() throws Exception {
parseAndCheckBindings(getAboveComment(), CPP, true);
}
// template <bool> struct B{};
// template <>
// struct B<true> {
// void waldo();
// };
// typedef char& one;
// int main() {
// B<sizeof(one) == 1> b;
// b.waldo();
// }
public void testSizeofReference_397342() throws Exception {
parseAndCheckBindings();
}
// struct A {
// char a[100];
// };
// struct B {
// A& b;
// };
// A* p;
public void testSizeofStructWithReferenceField_397342() throws Exception {
BindingAssertionHelper bh = getAssertionHelper();
IASTName nameB = bh.findName("B");
IASTName namep = bh.findName("p");
ICPPClassType B = (ICPPClassType) nameB.resolveBinding();
IPointerType ptrToA = (IPointerType) ((ICPPVariable) namep.resolveBinding()).getType();
long pointerSize = SizeofCalculator.getSizeAndAlignment(ptrToA, namep).size;
long BSize = SizeofCalculator.getSizeAndAlignment(B, nameB).size;
assertEquals(pointerSize, BSize);
}
} }

View file

@ -15,7 +15,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2CSpecTest extends AST2SpecBaseTest { public class AST2CSpecTest extends AST2SpecTestBase {
public AST2CSpecTest() { public AST2CSpecTest() {
} }

View file

@ -8,10 +8,6 @@
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
*******************************************************************************/ *******************************************************************************/
/*
* Created on Sept 28, 2004
*/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -39,116 +35,116 @@ import org.eclipse.core.runtime.NullProgressMonitor;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2FileBasePluginTest extends TestCase { public class AST2FileBasePluginTestCase extends TestCase {
static NullProgressMonitor monitor; static NullProgressMonitor monitor;
static IWorkspace workspace; static IWorkspace workspace;
static IProject project; static IProject project;
static FileManager fileManager; static FileManager fileManager;
static int numProjects = 0; static int numProjects;
static Class className; static Class className;
static ICProject cPrj; static ICProject cPrj;
public AST2FileBasePluginTest() { public AST2FileBasePluginTestCase() {
} }
public AST2FileBasePluginTest(String name) { public AST2FileBasePluginTestCase(String name) {
super(name); super(name);
} }
private void initialize(Class aClassName){ private void initialize(Class aClassName) {
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){ if (CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null) {
//(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset(); //(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
workspace = ResourcesPlugin.getWorkspace(); workspace = ResourcesPlugin.getWorkspace();
try { try {
cPrj = CProjectHelper.createCCProject("AST2BasedProjectMofo", "bin", IPDOMManager.ID_NO_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$ cPrj = CProjectHelper.createCCProject("AST2BasedProjectMofo", "bin", IPDOMManager.ID_NO_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject(); project = cPrj.getProject();
// ugly // ugly
if (className == null || !className.equals(aClassName)) { if (className == null || !className.equals(aClassName)) {
className = aClassName; className = aClassName;
numProjects++; numProjects++;
} }
} catch ( CoreException e ) { } catch (CoreException e) {
/*boo*/ // Ignore
} }
if (project == null) if (project == null)
throw new NullPointerException("Unable to create project"); //$NON-NLS-1$ throw new NullPointerException("Unable to create project"); //$NON-NLS-1$
//Create file manager // Create file manager
fileManager = new FileManager(); fileManager = new FileManager();
} }
} }
public AST2FileBasePluginTest(String name, Class className) public AST2FileBasePluginTestCase(String name, Class className) {
{
super(name); super(name);
initialize(className); initialize(className);
} }
public void cleanupProject() throws Exception { public void cleanupProject() throws Exception {
numProjects--; numProjects--;
try{ try {
if (numProjects == 0) { if (numProjects == 0) {
project.delete( true, false, monitor ); project.delete(true, false, monitor);
project = null; project = null;
} }
} catch( Throwable e ){ } catch (Throwable e) {
/*boo*/ // Ignore
} }
} }
@Override @Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
if( project == null || !project.exists() ) if (project == null || !project.exists())
return; return;
IResource [] members = project.members(); IResource[] members = project.members();
for( int i = 0; i < members.length; i++ ){ for (int i = 0; i < members.length; i++) {
if( members[i].getName().equals( ".project" ) || members[i].getName().equals( ".cproject" ) ) //$NON-NLS-1$ //$NON-NLS-2$ if (members[i].getName().equals(".project") || members[i].getName().equals(".cproject")) //$NON-NLS-1$ //$NON-NLS-2$
continue; continue;
if (members[i].getName().equals(".settings")) if (members[i].getName().equals(".settings"))
continue; continue;
try{ try {
members[i].delete( false, monitor ); members[i].delete(false, monitor);
} catch( Throwable e ){ } catch (Throwable e) {
/*boo*/ // Ignore
} }
} }
} }
protected IFolder importFolder(String folderName) throws Exception { protected IFolder importFolder(String folderName) throws Exception {
IFolder folder = project.getProject().getFolder(folderName); IFolder folder = project.getProject().getFolder(folderName);
//Create file input stream // Create file input stream
if( !folder.exists() ) if (!folder.exists())
folder.create( false, false, monitor ); folder.create(false, false, monitor);
return folder; return folder;
} }
public IFile importFile(String fileName, String contents ) throws Exception{
//Obtain file handle public IFile importFile(String fileName, String contents) throws Exception {
// Obtain file handle
IFile file = project.getProject().getFile(fileName); IFile file = project.getProject().getFile(fileName);
InputStream stream = new ByteArrayInputStream( contents.getBytes() ); InputStream stream = new ByteArrayInputStream(contents.getBytes());
//Create file input stream // Create file input stream
if( file.exists() ) if (file.exists()) {
file.setContents( stream, false, false, monitor ); file.setContents(stream, false, false, monitor);
else } else {
file.create( stream, false, monitor ); file.create(stream, false, monitor);
}
fileManager.addFile(file); fileManager.addFile(file);
return file; return file;
} }
protected StringBuilder[] getContents(int sections) throws IOException { protected StringBuilder[] getContents(int sections) throws IOException {
return TestSourceReader.getContentsForTest( return TestSourceReader.getContentsForTest(
CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections); CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections);
} }
} }

View file

@ -59,7 +59,7 @@ import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2KnRTests extends AST2BaseTest { public class AST2KnRTests extends AST2TestBase {
public AST2KnRTests() { public AST2KnRTests() {
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2010 IBM Corporation and others. * Copyright (c) 2005, 2013 IBM Corporation 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
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
@ -26,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
@ -46,7 +48,7 @@ import org.eclipse.core.resources.IFile;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2SelectionParseTest extends AST2SelectionParseBaseTest { public class AST2SelectionParseTest extends AST2SelectionParseTestBase {
public AST2SelectionParseTest() { public AST2SelectionParseTest() {
} }
@ -352,9 +354,10 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest {
assertTrue(node instanceof IASTTypeId); assertTrue(node instanceof IASTTypeId);
assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "Gonzo"); //$NON-NLS-1$ assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "Gonzo"); //$NON-NLS-1$
name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName(); name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName();
assertNotNull(name.resolveBinding()); name = TestUtil.findImplicitName(name);
assertTrue(name.resolveBinding() instanceof ICPPConstructor); IBinding binding = name.resolveBinding();
assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "Gonzo"); //$NON-NLS-1$ assertTrue(binding instanceof ICPPConstructor);
assertEquals(((ICPPConstructor)binding).getName(), "Gonzo"); //$NON-NLS-1$
break; break;
default: default:
assertTrue(node instanceof IASTName); assertTrue(node instanceof IASTName);
@ -736,9 +739,10 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest {
assertTrue(node instanceof IASTTypeId); assertTrue(node instanceof IASTTypeId);
assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "B"); //$NON-NLS-1$ assertEquals(((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName().toString(), "B"); //$NON-NLS-1$
IASTName name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName(); IASTName name = ((IASTNamedTypeSpecifier)((IASTTypeId)node).getDeclSpecifier()).getName();
assertNotNull(name.resolveBinding()); name = TestUtil.findImplicitName(name);
assertTrue(name.resolveBinding() instanceof ICPPConstructor); IBinding binding = name.resolveBinding();
assertEquals(((ICPPConstructor)name.resolveBinding()).getName(), "B"); //$NON-NLS-1$ assertTrue(binding instanceof ICPPConstructor);
assertEquals(((ICPPConstructor)binding).getName(), "B"); //$NON-NLS-1$
} }
public void testBug72712_2() throws Exception{ public void testBug72712_2() throws Exception{

View file

@ -29,7 +29,7 @@ import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.tests.FileBasePluginTest; import org.eclipse.cdt.core.parser.tests.FileBasePluginTestCase;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
@ -40,18 +40,18 @@ import org.eclipse.core.resources.IFile;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2SelectionParseBaseTest extends FileBasePluginTest { public class AST2SelectionParseTestBase extends FileBasePluginTestCase {
public AST2SelectionParseBaseTest() { public AST2SelectionParseTestBase() {
} }
public AST2SelectionParseBaseTest(String name) { public AST2SelectionParseTestBase(String name) {
super(name); super(name);
} }
private static final IParserLogService NULL_LOG = new NullLogService(); private static final IParserLogService NULL_LOG = new NullLogService();
public AST2SelectionParseBaseTest(String name, Class className) { public AST2SelectionParseTestBase(String name, Class className) {
super(name, className); super(name, className);
} }
@ -76,7 +76,7 @@ public class AST2SelectionParseBaseTest extends FileBasePluginTest {
protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems) throws ParserException { protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems) throws ParserException {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray()); FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
ScannerInfo scannerInfo = new ScannerInfo(); ScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
if (lang == ParserLanguage.CPP) { if (lang == ParserLanguage.CPP) {

View file

@ -41,12 +41,12 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2SpecBaseTest extends AST2BaseTest { public class AST2SpecTestBase extends AST2TestBase {
public AST2SpecBaseTest() { public AST2SpecTestBase() {
super(); super();
} }
public AST2SpecBaseTest(String name) { public AST2SpecTestBase(String name) {
super(name); super(name);
} }
@ -101,7 +101,7 @@ public class AST2SpecBaseTest extends AST2BaseTest {
boolean useGNUExtensions, boolean expectNoProblems, boolean checkBindings, boolean useGNUExtensions, boolean expectNoProblems, boolean checkBindings,
int expectedProblemBindings, String[] problems) throws ParserException { int expectedProblemBindings, String[] problems) throws ParserException {
ScannerInfo scannerInfo = new ScannerInfo(); ScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
if (lang == ParserLanguage.CPP) { if (lang == ParserLanguage.CPP) {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others. * Copyright (c) 2005, 2013 IBM Corporation 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
@ -44,6 +44,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IFunctionType;
@ -55,6 +56,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem; import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
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.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
@ -101,7 +103,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ParserException;
public class AST2TemplateTests extends AST2BaseTest { public class AST2TemplateTests extends AST2TestBase {
public AST2TemplateTests() { public AST2TemplateTests() {
} }
@ -2371,11 +2373,11 @@ public class AST2TemplateTests extends AST2BaseTest {
public void testCPPConstructorTemplateSpecialization() throws Exception { public void testCPPConstructorTemplateSpecialization() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), CPP, true, true); IASTTranslationUnit tu = parse(getAboveComment(), CPP, true, true);
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
ICPPASTTemplateId tid= (ICPPASTTemplateId) col.getName(20); IASTImplicitName tid= (IASTImplicitName) col.getName(20);
IASTName cn= col.getName(21); IASTName cn= col.getName(22);
assertInstance(cn.resolveBinding(), ICPPClassTemplate.class); // *D*<int>(5, 6) assertInstance(cn.resolveBinding(), ICPPClassTemplate.class); // *D*<int>(5, 6)
assertInstance(cn.resolveBinding(), ICPPClassType.class); // *D*<int>(5, 6) assertInstance(cn.resolveBinding(), ICPPClassType.class); // *D*<int>(5, 6)
assertInstance(tid.resolveBinding(), ICPPTemplateInstance.class); // *D<int>*(5, 6) assertInstance(tid.resolveBinding(), ICPPTemplateInstance.class); // *D<int>*(5, 6)
@ -3840,7 +3842,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// }; // };
public void testNestedTemplates_259872_1() throws Exception { public void testNestedTemplates_259872_1() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), CPP); BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), CPP);
bh.assertNonProblem("A<B, int>", 9, ICPPConstructor.class); bh.assertNonProblem("A<B, int>", 9, ICPPClassType.class);
} }
// template <typename CL, typename T> // template <typename CL, typename T>
@ -3865,7 +3867,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// }; // };
public void testNestedTemplates_259872_2() throws Exception { public void testNestedTemplates_259872_2() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), CPP); BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), CPP);
bh.assertNonProblem("A<B, int>", 9, ICPPConstructor.class); bh.assertNonProblem("A<B, int>", 9, ICPPClassType.class);
} }
// template <class T> // template <class T>
@ -4403,6 +4405,17 @@ public class AST2TemplateTests extends AST2BaseTest {
parseAndCheckBindings(); parseAndCheckBindings();
} }
// template <typename A>
// void foo(A);
// template <typename A, typename... B>
// void foo(A, B...);
// int main() {
// foo(0);
// }
public void testFunctionTemplatePartialOrdering_388805() throws Exception {
parseAndCheckBindings();
}
// template<typename T> class CT {}; // template<typename T> class CT {};
// template<int I> class CTI {}; // template<int I> class CTI {};
// //
@ -4828,6 +4841,25 @@ public class AST2TemplateTests extends AST2BaseTest {
ub= bh.assertNonProblem("f(h(args...) + args...)", 1); ub= bh.assertNonProblem("f(h(args...) + args...)", 1);
} }
// template <typename... Args>
// struct contains_waldo;
// template <>
// struct contains_waldo<> {
// static const bool value = false;
// };
// template <typename First, typename... Rest>
// struct contains_waldo<First, Rest...> {
// static const bool value = contains_waldo<Rest...>::value;
// };
// int main() {
// bool b1 = contains_waldo<int>::value;
// bool b2 = contains_waldo<int, int>::value;
// bool b2 = contains_waldo<int, int, int>::value;
// }
public void testRecursiveVariadicTemplate_397828() throws Exception {
parseAndCheckBindings();
}
// struct Test { // struct Test {
// void Update() {} // void Update() {}
// }; // };
@ -6219,24 +6251,24 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testSimpleAliasDeclaration() throws Exception { public void testSimpleAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
ICPPClassType S = assertionHelper.assertNonProblem("struct S {", "S", ICPPClassType.class); ICPPClassType S = assertionHelper.assertNonProblem("struct S {", "S", ICPPClassType.class);
ICPPField x = assertionHelper.assertNonProblem("int x", "x", ICPPField.class); ICPPField x = assertionHelper.assertNonProblem("int x", "x", ICPPField.class);
ITypedef Alias = assertionHelper.assertNonProblem("using Alias = S", "Alias", ITypedef.class); ITypedef Alias = assertionHelper.assertNonProblem("using Alias = S", "Alias", ITypedef.class);
IFunction foo = assertionHelper.assertNonProblem("void foo() {", "foo", IFunction.class); IFunction foo = assertionHelper.assertNonProblem("void foo() {", "foo", IFunction.class);
IVariable myA = assertionHelper.assertNonProblem("Alias myA", "myA", IVariable.class); IVariable myA = assertionHelper.assertNonProblem("Alias myA", "myA", IVariable.class);
assertInstances(collector, S, 2); assertInstances(collector, S, 2);
assertInstances(collector, x, 2); assertInstances(collector, x, 2);
assertInstances(collector, Alias, 2); assertInstances(collector, Alias, 2);
assertInstances(collector, foo, 1); assertInstances(collector, foo, 1);
assertInstances(collector, myA, 2); assertInstances(collector, myA, 2);
} }
// template<typename T> // template<typename T>
// struct S { // struct S {
// T x; // T x;
@ -6248,7 +6280,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testSpecifiedTemplateAliasDeclaration() throws Exception { public void testSpecifiedTemplateAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
@ -6257,7 +6289,7 @@ public class AST2TemplateTests extends AST2BaseTest {
ITypedef Alias = assertionHelper.assertNonProblem("using Alias = S<int>;", "Alias", ITypedef.class); ITypedef Alias = assertionHelper.assertNonProblem("using Alias = S<int>;", "Alias", ITypedef.class);
IVariable myA = assertionHelper.assertNonProblem("Alias myA;", "myA", IVariable.class); IVariable myA = assertionHelper.assertNonProblem("Alias myA;", "myA", IVariable.class);
ICPPSpecialization xRef = assertionHelper.assertNonProblem("myA.x = 42;", "x", ICPPSpecialization.class); ICPPSpecialization xRef = assertionHelper.assertNonProblem("myA.x = 42;", "x", ICPPSpecialization.class);
assertInstances(collector, S, 2); assertInstances(collector, S, 2);
assertInstances(collector, Alias, 2); assertInstances(collector, Alias, 2);
@ -6273,13 +6305,13 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasBasicType() throws Exception { public void testTemplatedAliasBasicType() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
ICPPAliasTemplate Alias = assertionHelper.assertNonProblem("using Alias = int;", "Alias", ICPPAliasTemplate.class); ICPPAliasTemplate Alias = assertionHelper.assertNonProblem("using Alias = int;", "Alias", ICPPAliasTemplate.class);
ICPPAliasTemplateInstance aliasFloatInstance = assertionHelper.assertNonProblem("Alias<float> myA;", "Alias<float>", ICPPAliasTemplateInstance.class); ICPPAliasTemplateInstance aliasFloatInstance = assertionHelper.assertNonProblem("Alias<float> myA;", "Alias<float>", ICPPAliasTemplateInstance.class);
assertInstances(collector, Alias, 2); assertInstances(collector, Alias, 2);
assertSameType(aliasFloatInstance, new CPPBasicType(IBasicType.Kind.eInt, 0)); assertSameType(aliasFloatInstance, new CPPBasicType(IBasicType.Kind.eInt, 0));
} }
@ -6296,7 +6328,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasDeclaration() throws Exception { public void testTemplatedAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
@ -6334,9 +6366,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasDeclarationMultipleParameters() throws Exception { public void testTemplatedAliasDeclarationMultipleParameters() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField t1 = assertionHelper.assertNonProblem("T1 t1;", "t1", ICPPField.class); ICPPField t1 = assertionHelper.assertNonProblem("T1 t1;", "t1", ICPPField.class);
ICPPField t2 = assertionHelper.assertNonProblem("T2 t2;", "t2", ICPPField.class); ICPPField t2 = assertionHelper.assertNonProblem("T2 t2;", "t2", ICPPField.class);
ICPPField t3 = assertionHelper.assertNonProblem("T3 t3;", "t3", ICPPField.class); ICPPField t3 = assertionHelper.assertNonProblem("T3 t3;", "t3", ICPPField.class);
@ -6377,9 +6409,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasDeclarationTemplateArgument() throws Exception { public void testTemplatedAliasDeclarationTemplateArgument() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class); ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class);
ICPPAliasTemplateInstance TAliasSInt = assertionHelper.assertNonProblem("TAlias<S<int>> myA;", "TAlias<S<int>>", ICPPAliasTemplateInstance.class); ICPPAliasTemplateInstance TAliasSInt = assertionHelper.assertNonProblem("TAlias<S<int>> myA;", "TAlias<S<int>>", ICPPAliasTemplateInstance.class);
ICPPSpecialization tRef = assertionHelper.assertNonProblem("myA.t = S<int>()", "t", ICPPSpecialization.class); ICPPSpecialization tRef = assertionHelper.assertNonProblem("myA.t = S<int>()", "t", ICPPSpecialization.class);
@ -6400,9 +6432,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasAsTemplateArgument() throws Exception { public void testTemplatedAliasAsTemplateArgument() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class); ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class);
ICPPTemplateInstance STAliasInt = assertionHelper.assertNonProblem("S<TAlias<int>> myA;", "S<TAlias<int>>", ICPPTemplateInstance.class); ICPPTemplateInstance STAliasInt = assertionHelper.assertNonProblem("S<TAlias<int>> myA;", "S<TAlias<int>>", ICPPTemplateInstance.class);
ICPPSpecialization tRef = assertionHelper.assertNonProblem("myA.t = S<int>();", "t", ICPPSpecialization.class); ICPPSpecialization tRef = assertionHelper.assertNonProblem("myA.t = S<int>();", "t", ICPPSpecialization.class);
@ -6423,9 +6455,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasDeclarationValueArgument() throws Exception { public void testTemplatedAliasDeclarationValueArgument() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField buff = assertionHelper.assertNonProblem("int buff [Size];", "buff", ICPPField.class); ICPPField buff = assertionHelper.assertNonProblem("int buff [Size];", "buff", ICPPField.class);
ICPPSpecialization buffRef = assertionHelper.assertNonProblem("myA.buff[0] = 1;", "buff", ICPPSpecialization.class); ICPPSpecialization buffRef = assertionHelper.assertNonProblem("myA.buff[0] = 1;", "buff", ICPPSpecialization.class);
@ -6446,9 +6478,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasDefaultArguments() throws Exception { public void testTemplatedAliasDefaultArguments() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField buff = assertionHelper.assertNonProblem("T buff [Size];", "buff", ICPPField.class); ICPPField buff = assertionHelper.assertNonProblem("T buff [Size];", "buff", ICPPField.class);
ICPPAliasTemplateInstance myA = assertionHelper.assertNonProblem("TAlias<> myA;", "TAlias<>", ICPPAliasTemplateInstance.class); ICPPAliasTemplateInstance myA = assertionHelper.assertNonProblem("TAlias<> myA;", "TAlias<>", ICPPAliasTemplateInstance.class);
ICPPSpecialization buffRef = assertionHelper.assertNonProblem("myA.buff[0] = 1;", "buff", ICPPSpecialization.class); ICPPSpecialization buffRef = assertionHelper.assertNonProblem("myA.buff[0] = 1;", "buff", ICPPSpecialization.class);
@ -6470,9 +6502,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasTemplateArgument() throws Exception { public void testTemplatedAliasTemplateArgument() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class); ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class);
ICPPSpecialization tRef = assertionHelper.assertNonProblem(" myA.t = S<int>();", "t", ICPPSpecialization.class); ICPPSpecialization tRef = assertionHelper.assertNonProblem(" myA.t = S<int>();", "t", ICPPSpecialization.class);
ICPPClassSpecialization Sint = assertionHelper.assertNonProblem("myA.t = S<int>();", "S<int>", ICPPClassSpecialization.class); ICPPClassSpecialization Sint = assertionHelper.assertNonProblem("myA.t = S<int>();", "S<int>", ICPPClassSpecialization.class);
@ -6497,9 +6529,9 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasAsFunctionParameter() throws Exception { public void testTemplatedAliasAsFunctionParameter() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPFunction bar = assertionHelper.assertNonProblem("void bar(TAlias<int> arg){", "bar", ICPPFunction.class); ICPPFunction bar = assertionHelper.assertNonProblem("void bar(TAlias<int> arg){", "bar", ICPPFunction.class);
ICPPFunction barRefAlias = assertionHelper.assertNonProblem("bar(myA);", "bar", ICPPFunction.class); ICPPFunction barRefAlias = assertionHelper.assertNonProblem("bar(myA);", "bar", ICPPFunction.class);
ICPPFunction barRefSInt = assertionHelper.assertNonProblem("bar(myS);", "bar", ICPPFunction.class); ICPPFunction barRefSInt = assertionHelper.assertNonProblem("bar(myS);", "bar", ICPPFunction.class);
@ -6522,7 +6554,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasAsFunctionArgument() throws Exception { public void testTemplatedAliasAsFunctionArgument() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPFunction bar = assertionHelper.assertNonProblem("void bar(S<int> arg){", "bar", ICPPFunction.class); ICPPFunction bar = assertionHelper.assertNonProblem("void bar(S<int> arg){", "bar", ICPPFunction.class);
@ -6571,7 +6603,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testSimpleFunctionAliasDeclaration() throws Exception { public void testSimpleFunctionAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
@ -6596,7 +6628,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasForTemplateReference() throws Exception { public void testTemplatedAliasForTemplateReference() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPClassSpecialization SInt = assertionHelper.assertNonProblem("S<int> myS;", "S<int>", ICPPClassSpecialization.class); ICPPClassSpecialization SInt = assertionHelper.assertNonProblem("S<int> myS;", "S<int>", ICPPClassSpecialization.class);
@ -6612,7 +6644,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testSimpleFunctionTemplateAliasDeclaration() throws Exception { public void testSimpleFunctionTemplateAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
@ -6632,7 +6664,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testSimpleFunctionReferenceTemplateAliasDeclaration() throws Exception { public void testSimpleFunctionReferenceTemplateAliasDeclaration() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit()); CPPNameCollector collector = getCPPNameCollector(assertionHelper.getTranslationUnit());
@ -6657,7 +6689,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// } // }
public void testTemplatedAliasTemplateParameter() throws Exception { public void testTemplatedAliasTemplateParameter() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class); ICPPField t = assertionHelper.assertNonProblem("T t;", "t", ICPPField.class);
@ -6680,10 +6712,11 @@ public class AST2TemplateTests extends AST2BaseTest {
// Alias<int> intAlias; // Alias<int> intAlias;
public void testAliasDeclarationContext() throws Exception { public void testAliasDeclarationContext() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
BindingAssertionHelper assertionHelper = getAssertionHelper(); BindingAssertionHelper assertionHelper = getAssertionHelper();
ICPPAliasTemplateInstance AliasInt = assertionHelper.assertNonProblem("Alias<int> intAlias;", "Alias<int>", ICPPAliasTemplateInstance.class); ICPPAliasTemplateInstance AliasInt =
assertionHelper.assertNonProblem("Alias<int> intAlias;", "Alias<int>", ICPPAliasTemplateInstance.class);
assertEquals("Alias<int>", AliasInt.getName()); assertEquals("Alias<int>", AliasInt.getName());
assertEquals("NS", AliasInt.getQualifiedName()[0]); assertEquals("NS", AliasInt.getQualifiedName()[0]);
assertEquals("Alias<int>", AliasInt.getQualifiedName()[1]); assertEquals("Alias<int>", AliasInt.getQualifiedName()[1]);
@ -7004,4 +7037,92 @@ public class AST2TemplateTests extends AST2BaseTest {
public void testDependentExpressions_395243d() throws Exception { public void testDependentExpressions_395243d() throws Exception {
parseAndCheckBindings(); parseAndCheckBindings();
} }
// template <typename T>
// struct B {
// enum { value = 1 };
// };
//
// template <typename T>
// struct C {
// enum { id = B<T>::value };
// };
//
// void test() {
// int x = C<bool>::id;
// }
public void _testDependentEnumValue_389009() throws Exception {
BindingAssertionHelper ah = getAssertionHelper();
IEnumerator binding = ah.assertNonProblem("C<bool>::id", "id");
IValue value = binding.getValue();
Long num = value.numericalValue();
assertNotNull(num);
assertEquals(1, num.longValue());
}
// template <int...> struct A {};
// template <int... I> void foo(A<I...>);
// int main() {
// foo(A<0>());
// }
public void testVariadicNonTypeTemplateParameter_382074() throws Exception {
parseAndCheckBindings();
}
// template <bool...>
// struct ice_or {
// static const bool value = false;
// };
// template <typename T>
// struct is_foo {
// static const bool value = false;
// };
// template <typename... Args>
// struct contains_foo {
// static const bool value = ice_or<is_foo<Args>::value...>::value;
// };
// template <bool>
// struct meta;
// struct S { void bar(); };
// template <>
// struct meta<false> {
// typedef S type;
// };
// int main() {
// meta<contains_foo<>::value>::type t;
// t.bar();
// }
public void testVariadicNonTypeTemplateParameter_399039() throws Exception {
parseAndCheckBindings();
}
// template <typename...>
// struct common_type;
// template <typename T>
// struct common_type<T> {
// typedef int type;
// };
// template <typename T, typename... U>
// struct common_type<T, U...> {
// typedef int type;
// };
// typedef common_type<int>::type type;
public void testClassTemplateSpecializationPartialOrdering_398044a() throws Exception {
parseAndCheckBindings();
}
// template <typename>
// class A;
// template <typename R, typename... Args>
// class A<R(*)(Args...)> {
// };
// template <typename R>
// class A<R*> {
// };
// int main() {
// A<bool(*)()> mf;
// }
public void testClassTemplateSpecializationPartialOrdering_398044b() throws Exception {
parseAndCheckBindings();
}
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2012 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
@ -95,7 +95,7 @@ import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
/** /**
* @author aniefer * @author aniefer
*/ */
public class AST2BaseTest extends BaseTestCase { public class AST2TestBase extends BaseTestCase {
public final static String TEST_CODE = "<testcode>"; public final static String TEST_CODE = "<testcode>";
protected static final IParserLogService NULL_LOG = new NullLogService(); protected static final IParserLogService NULL_LOG = new NullLogService();
protected static boolean sValidateCopy; protected static boolean sValidateCopy;
@ -110,6 +110,7 @@ public class AST2BaseTest extends BaseTestCase {
map.put("__SIZEOF_SHORT__", "2"); map.put("__SIZEOF_SHORT__", "2");
map.put("__SIZEOF_INT__", "4"); map.put("__SIZEOF_INT__", "4");
map.put("__SIZEOF_LONG__", "8"); map.put("__SIZEOF_LONG__", "8");
map.put("__SIZEOF_POINTER__", "8");
return map; return map;
} }
@ -118,17 +119,18 @@ public class AST2BaseTest extends BaseTestCase {
map.put("__SIZEOF_SHORT__", "2"); map.put("__SIZEOF_SHORT__", "2");
map.put("__SIZEOF_INT__", "4"); map.put("__SIZEOF_INT__", "4");
map.put("__SIZEOF_LONG__", "8"); map.put("__SIZEOF_LONG__", "8");
map.put("__SIZEOF_POINTER__", "8");
return map; return map;
} }
public AST2BaseTest() { public AST2TestBase() {
super(); super();
} }
public AST2BaseTest(String name) { public AST2TestBase(String name) {
super(name); super(name);
} }
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
sValidateCopy= true; sValidateCopy= true;
@ -138,7 +140,7 @@ public class AST2BaseTest extends BaseTestCase {
protected IASTTranslationUnit parse(String code, ParserLanguage lang) throws ParserException { protected IASTTranslationUnit parse(String code, ParserLanguage lang) throws ParserException {
return parse(code, lang, false, true); return parse(code, lang, false, true);
} }
protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions) throws ParserException { protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions) throws ParserException {
return parse(code, lang, useGNUExtensions, true); return parse(code, lang, useGNUExtensions, true);
} }
@ -147,10 +149,10 @@ public class AST2BaseTest extends BaseTestCase {
boolean expectNoProblems) throws ParserException { boolean expectNoProblems) throws ParserException {
return parse(code, lang, useGNUExtensions, expectNoProblems, false); return parse(code, lang, useGNUExtensions, expectNoProblems, false);
} }
protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions, protected IASTTranslationUnit parse(String code, ParserLanguage lang, boolean useGNUExtensions,
boolean expectNoProblems, boolean skipTrivialInitializers) throws ParserException { boolean expectNoProblems, boolean skipTrivialInitializers) throws ParserException {
IScanner scanner = createScanner(FileContent.create(TEST_CODE, code.toCharArray()), lang, ParserMode.COMPLETE_PARSE, IScanner scanner = createScanner(FileContent.create(TEST_CODE, code.toCharArray()), lang, ParserMode.COMPLETE_PARSE,
createScannerInfo(useGNUExtensions)); createScannerInfo(useGNUExtensions));
configureScanner(scanner); configureScanner(scanner);
AbstractGNUSourceCodeParser parser = null; AbstractGNUSourceCodeParser parser = null;
@ -170,12 +172,12 @@ public class AST2BaseTest extends BaseTestCase {
} else { } else {
config = new ANSICParserExtensionConfiguration(); config = new ANSICParserExtensionConfiguration();
} }
parser = new GNUCSourceParser(scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, config, null); parser = new GNUCSourceParser(scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, config, null);
} }
if (skipTrivialInitializers) if (skipTrivialInitializers)
parser.setSkipTrivialExpressionsInAggregateInitializers(true); parser.setSkipTrivialExpressionsInAggregateInitializers(true);
IASTTranslationUnit tu = parser.parse(); IASTTranslationUnit tu = parser.parse();
assertTrue(tu.isFrozen()); assertTrue(tu.isFrozen());
if (sValidateCopy) if (sValidateCopy)
@ -183,7 +185,7 @@ public class AST2BaseTest extends BaseTestCase {
if (parser.encounteredError() && expectNoProblems) if (parser.encounteredError() && expectNoProblems)
throw new ParserException("FAILURE"); //$NON-NLS-1$ throw new ParserException("FAILURE"); //$NON-NLS-1$
if (lang == ParserLanguage.C && expectNoProblems) { if (lang == ParserLanguage.C && expectNoProblems) {
assertEquals(CVisitor.getProblems(tu).length, 0); assertEquals(CVisitor.getProblems(tu).length, 0);
assertEquals(tu.getPreprocessorProblems().length, 0); assertEquals(tu.getPreprocessorProblems().length, 0);
@ -193,7 +195,7 @@ public class AST2BaseTest extends BaseTestCase {
} }
if (expectNoProblems) if (expectNoProblems)
assertEquals(0, tu.getPreprocessorProblems().length); assertEquals(0, tu.getPreprocessorProblems().length);
return tu; return tu;
} }
@ -215,7 +217,7 @@ public class AST2BaseTest extends BaseTestCase {
configuration= GPPScannerExtensionConfiguration.getInstance(scannerInfo); configuration= GPPScannerExtensionConfiguration.getInstance(scannerInfo);
} }
IScanner scanner; IScanner scanner;
scanner= new CPreprocessor(codeReader, scannerInfo, lang, NULL_LOG, configuration, scanner= new CPreprocessor(codeReader, scannerInfo, lang, NULL_LOG, configuration,
IncludeFileContentProvider.getSavedFilesProvider()); IncludeFileContentProvider.getSavedFilesProvider());
return scanner; return scanner;
} }
@ -263,7 +265,7 @@ public class AST2BaseTest extends BaseTestCase {
} }
protected void validateSimpleBinaryExpressionC(String code, int operand) throws ParserException { protected void validateSimpleBinaryExpressionC(String code, int operand) throws ParserException {
IASTBinaryExpression e = (IASTBinaryExpression) getExpressionFromStatementInCode(code, ParserLanguage.C); IASTBinaryExpression e = (IASTBinaryExpression) getExpressionFromStatementInCode(code, ParserLanguage.C);
assertNotNull(e); assertNotNull(e);
assertEquals(e.getOperator(), operand); assertEquals(e.getOperator(), operand);
IASTIdExpression x = (IASTIdExpression) e.getOperand1(); IASTIdExpression x = (IASTIdExpression) e.getOperand1();
@ -290,8 +292,8 @@ public class AST2BaseTest extends BaseTestCase {
ASTComparer.assertCopy(tu, copy); ASTComparer.assertCopy(tu, copy);
return (T) copy; return (T) copy;
} }
static protected class CNameCollector extends ASTVisitor { static protected class CNameCollector extends ASTVisitor {
{ {
shouldVisitNames = true; shouldVisitNames = true;
@ -309,29 +311,35 @@ public class AST2BaseTest extends BaseTestCase {
return null; return null;
return nameList.get(idx); return nameList.get(idx);
} }
public int size() { public int size() {
return nameList.size(); return nameList.size();
} }
} }
protected void assertInstances(CNameCollector collector, IBinding binding, int num) throws Exception { protected void assertInstances(CNameCollector collector, IBinding binding, int num) throws Exception {
int count = 0; int count = 0;
assertNotNull(binding); assertNotNull(binding);
for (int i = 0; i < collector.size(); i++) { for (int i = 0; i < collector.size(); i++) {
if (collector.getName(i).resolveBinding() == binding) if (collector.getName(i).resolveBinding() == binding)
count++; count++;
} }
assertEquals(count, num); assertEquals(count, num);
} }
static protected class CPPNameCollector extends ASTVisitor { static protected class CPPNameCollector extends ASTVisitor {
{ public CPPNameCollector() {
shouldVisitNames = true; this(false); // don't visit implicit names by default
} }
public CPPNameCollector(boolean shouldVisitImplicitNames) {
this.shouldVisitNames = true;
this.shouldVisitImplicitNames = shouldVisitImplicitNames;
}
public List<IASTName> nameList = new ArrayList<IASTName>(); public List<IASTName> nameList = new ArrayList<IASTName>();
@Override @Override
@ -349,7 +357,7 @@ public class AST2BaseTest extends BaseTestCase {
public int size() { public int size() {
return nameList.size(); return nameList.size();
} }
public void dump() { public void dump() {
for (int i= 0; i < size(); i++) { for (int i= 0; i < size(); i++) {
IASTName name= getName(i); IASTName name= getName(i);
@ -365,7 +373,7 @@ public class AST2BaseTest extends BaseTestCase {
if (collector.getName(i).resolveBinding() == binding) if (collector.getName(i).resolveBinding() == binding)
count++; count++;
} }
assertEquals(num, count); assertEquals(num, count);
} }
@ -386,42 +394,42 @@ public class AST2BaseTest extends BaseTestCase {
String expressionString = ASTStringUtil.getExpressionString(exp); String expressionString = ASTStringUtil.getExpressionString(exp);
assertEquals(str, expressionString); assertEquals(str, expressionString);
} }
protected void isParameterSignatureEqual(IASTDeclarator decltor, String str) { protected void isParameterSignatureEqual(IASTDeclarator decltor, String str) {
assertTrue(decltor instanceof IASTFunctionDeclarator); assertTrue(decltor instanceof IASTFunctionDeclarator);
final String[] sigArray = ASTStringUtil.getParameterSignatureArray((IASTFunctionDeclarator) decltor); final String[] sigArray = ASTStringUtil.getParameterSignatureArray((IASTFunctionDeclarator) decltor);
assertEquals(str, "(" + ASTStringUtil.join(sigArray, ", ") + ")"); assertEquals(str, "(" + ASTStringUtil.join(sigArray, ", ") + ")");
} }
protected void isSignatureEqual(IASTDeclarator declarator, String expected) { protected void isSignatureEqual(IASTDeclarator declarator, String expected) {
String signature= ASTStringUtil.getSignatureString(declarator); String signature= ASTStringUtil.getSignatureString(declarator);
assertEquals(expected, signature); assertEquals(expected, signature);
} }
protected void isSignatureEqual(IASTDeclSpecifier declSpec, String str) { protected void isSignatureEqual(IASTDeclSpecifier declSpec, String str) {
assertEquals(str, ASTStringUtil.getSignatureString(declSpec, null)); assertEquals(str, ASTStringUtil.getSignatureString(declSpec, null));
} }
protected void isSignatureEqual(IASTTypeId typeId, String str) { protected void isSignatureEqual(IASTTypeId typeId, String str) {
assertEquals(str, ASTStringUtil.getSignatureString(typeId.getDeclSpecifier(), typeId.getAbstractDeclarator())); assertEquals(str, ASTStringUtil.getSignatureString(typeId.getDeclSpecifier(), typeId.getAbstractDeclarator()));
} }
protected void isTypeEqual(IASTDeclarator decltor, String str) { protected void isTypeEqual(IASTDeclarator decltor, String str) {
assertEquals(str, ASTTypeUtil.getType(decltor)); assertEquals(str, ASTTypeUtil.getType(decltor));
} }
protected void isTypeEqual(IASTTypeId typeId, String str) { protected void isTypeEqual(IASTTypeId typeId, String str) {
assertEquals(str, ASTTypeUtil.getType(typeId)); assertEquals(str, ASTTypeUtil.getType(typeId));
} }
protected void isTypeEqual(IType type, String str) { protected void isTypeEqual(IType type, String str) {
assertEquals(str, ASTTypeUtil.getType(type)); assertEquals(str, ASTTypeUtil.getType(type));
} }
protected void isParameterTypeEqual(IFunctionType fType, String str) { protected void isParameterTypeEqual(IFunctionType fType, String str) {
assertEquals(str, ASTTypeUtil.getParameterTypeString(fType)); assertEquals(str, ASTTypeUtil.getParameterTypeString(fType));
} }
static protected class CNameResolver extends ASTVisitor { static protected class CNameResolver extends ASTVisitor {
{ {
shouldVisitNames = true; shouldVisitNames = true;
@ -449,9 +457,9 @@ public class AST2BaseTest extends BaseTestCase {
public int size() { public int size() {
return nameList.size(); return nameList.size();
} }
} }
static protected class CPPNameResolver extends ASTVisitor { static protected class CPPNameResolver extends ASTVisitor {
{ {
shouldVisitNames = true; shouldVisitNames = true;
@ -479,13 +487,13 @@ public class AST2BaseTest extends BaseTestCase {
public int size() { public int size() {
return nameList.size(); return nameList.size();
} }
} }
protected String getAboveComment() throws IOException { protected String getAboveComment() throws IOException {
return getContents(1)[0].toString(); return getContents(1)[0].toString();
} }
protected CharSequence[] getContents(int sections) throws IOException { protected CharSequence[] getContents(int sections) throws IOException {
CTestPlugin plugin = CTestPlugin.getDefault(); CTestPlugin plugin = CTestPlugin.getDefault();
if (plugin == null) if (plugin == null)
@ -502,14 +510,14 @@ public class AST2BaseTest extends BaseTestCase {
} }
return clazz.cast(o); return clazz.cast(o);
} }
protected static void assertField(IBinding binding, String fieldName, String ownerName) { protected static void assertField(IBinding binding, String fieldName, String ownerName) {
assertInstance(binding, IField.class); assertInstance(binding, IField.class);
assertEquals(fieldName, binding.getName()); assertEquals(fieldName, binding.getName());
ICompositeType struct = ((IField) binding).getCompositeTypeOwner(); ICompositeType struct = ((IField) binding).getCompositeTypeOwner();
assertEquals(ownerName, struct.getName()); assertEquals(ownerName, struct.getName());
} }
protected class BindingAssertionHelper { protected class BindingAssertionHelper {
protected IASTTranslationUnit tu; protected IASTTranslationUnit tu;
protected String contents; protected String contents;
@ -562,7 +570,7 @@ public class AST2BaseTest extends BaseTestCase {
IBinding binding= binding(section, len); IBinding binding= binding(section, len);
if (binding instanceof IProblemBinding) { if (binding instanceof IProblemBinding) {
IProblemBinding problem= (IProblemBinding) binding; IProblemBinding problem= (IProblemBinding) binding;
fail("ProblemBinding for name: " + section.substring(0, len) + " (" + renderProblemID(problem.getID()) + ")"); fail("ProblemBinding for name: " + section.substring(0, len) + " (" + renderProblemID(problem.getID()) + ")");
} }
if (binding == null) { if (binding == null) {
fail("Null binding resolved for name: " + section.substring(0, len)); fail("Null binding resolved for name: " + section.substring(0, len));
@ -611,12 +619,12 @@ public class AST2BaseTest extends BaseTestCase {
IASTName name = findImplicitName(section, len); IASTName name = findImplicitName(section, len);
final String selection = section.substring(0, len); final String selection = section.substring(0, len);
assertNotNull("did not find \"" + selection + "\"", name); assertNotNull("did not find \"" + selection + "\"", name);
assertInstance(name, IASTImplicitName.class); assertInstance(name, IASTImplicitName.class);
IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent(); IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent();
IASTImplicitName[] implicits = owner.getImplicitNames(); IASTImplicitName[] implicits = owner.getImplicitNames();
assertNotNull(implicits); assertNotNull(implicits);
if (implicits.length > 1) { if (implicits.length > 1) {
boolean found = false; boolean found = false;
for (IASTImplicitName n : implicits) { for (IASTImplicitName n : implicits) {
@ -627,34 +635,34 @@ public class AST2BaseTest extends BaseTestCase {
} }
assertTrue(found); assertTrue(found);
} }
assertEquals(selection, name.getRawSignature()); assertEquals(selection, name.getRawSignature());
IBinding binding = name.resolveBinding(); IBinding binding = name.resolveBinding();
assertNotNull(binding); assertNotNull(binding);
assertInstance(binding, bindingClass); assertInstance(binding, bindingClass);
return (IASTImplicitName) name; return (IASTImplicitName) name;
} }
public void assertNoImplicitName(String section, int len) { public void assertNoImplicitName(String section, int len) {
IASTName name = findImplicitName(section, len); IASTName name = findImplicitName(section, len);
final String selection = section.substring(0, len); final String selection = section.substring(0, len);
assertNull("found name \"" + selection + "\"", name); assertNull("found name \"" + selection + "\"", name);
} }
public IASTImplicitName[] getImplicitNames(String section, int len) { public IASTImplicitName[] getImplicitNames(String section, int len) {
IASTName name = findImplicitName(section, len); IASTName name = findImplicitName(section, len);
IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent(); IASTImplicitNameOwner owner = (IASTImplicitNameOwner) name.getParent();
IASTImplicitName[] implicits = owner.getImplicitNames(); IASTImplicitName[] implicits = owner.getImplicitNames();
return implicits; return implicits;
} }
public IASTName findName(String section, int len) { public IASTName findName(String section, int len) {
final int offset = contents.indexOf(section); final int offset = contents.indexOf(section);
assertTrue("Section \"" + section + "\" not found", offset >= 0); assertTrue("Section \"" + section + "\" not found", offset >= 0);
IASTNodeSelector selector = tu.getNodeSelector(null); IASTNodeSelector selector = tu.getNodeSelector(null);
return selector.findName(offset, len); return selector.findName(offset, len);
} }
public IASTName findName(String context, String name) { public IASTName findName(String context, String name) {
if (context == null) { if (context == null) {
context = contents; context = contents;
@ -712,7 +720,7 @@ public class AST2BaseTest extends BaseTestCase {
} }
return "Unknown problem ID"; return "Unknown problem ID";
} }
public <T extends IBinding> T assertNonProblem(String section, int len, Class... cs) { public <T extends IBinding> T assertNonProblem(String section, int len, Class... cs) {
if (len <= 0) if (len <= 0)
len += section.length(); len += section.length();
@ -744,10 +752,10 @@ public class AST2BaseTest extends BaseTestCase {
final String selection = section.substring(0, len); final String selection = section.substring(0, len);
assertNotNull("No AST name for \"" + selection + "\"", astName); assertNotNull("No AST name for \"" + selection + "\"", astName);
assertEquals(selection, astName.getRawSignature()); assertEquals(selection, astName.getRawSignature());
IBinding binding = astName.resolveBinding(); IBinding binding = astName.resolveBinding();
assertNotNull("No binding for " + astName.getRawSignature(), binding); assertNotNull("No binding for " + astName.getRawSignature(), binding);
return astName.resolveBinding(); return astName.resolveBinding();
} }
@ -755,10 +763,10 @@ public class AST2BaseTest extends BaseTestCase {
IASTName astName = findName(context, name); IASTName astName = findName(context, name);
assertNotNull("No AST name for \"" + name + "\"", astName); assertNotNull("No AST name for \"" + name + "\"", astName);
assertEquals(name, astName.getRawSignature()); assertEquals(name, astName.getRawSignature());
IBinding binding = astName.resolveBinding(); IBinding binding = astName.resolveBinding();
assertNotNull("No binding for " + astName.getRawSignature(), binding); assertNotNull("No binding for " + astName.getRawSignature(), binding);
return astName.resolveBinding(); return astName.resolveBinding();
} }
} }
@ -770,10 +778,10 @@ public class AST2BaseTest extends BaseTestCase {
final protected IASTTranslationUnit parseAndCheckBindings(String code, ParserLanguage lang, boolean useGnuExtensions) throws Exception { final protected IASTTranslationUnit parseAndCheckBindings(String code, ParserLanguage lang, boolean useGnuExtensions) throws Exception {
return parseAndCheckBindings(code, lang, useGnuExtensions, false); return parseAndCheckBindings(code, lang, useGnuExtensions, false);
} }
final protected IASTTranslationUnit parseAndCheckBindings(String code, ParserLanguage lang, boolean useGnuExtensions, final protected IASTTranslationUnit parseAndCheckBindings(String code, ParserLanguage lang, boolean useGnuExtensions,
boolean skipTrivialInitializers) throws Exception { boolean skipTrivialInitializers) throws Exception {
IASTTranslationUnit tu = parse(code, lang, useGnuExtensions, true, skipTrivialInitializers); IASTTranslationUnit tu = parse(code, lang, useGnuExtensions, true, skipTrivialInitializers);
CNameCollector col = new CNameCollector(); CNameCollector col = new CNameCollector();
tu.accept(col); tu.accept(col);
assertNoProblemBindings(col); assertNoProblemBindings(col);

View file

@ -17,7 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
public class AST2UtilOldTests extends AST2BaseTest { public class AST2UtilOldTests extends AST2TestBase {
public AST2UtilOldTests() { public AST2UtilOldTests() {
} }
public AST2UtilOldTests(String name) { public AST2UtilOldTests(String name) {

View file

@ -27,7 +27,7 @@ import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class AST2UtilTests extends AST2BaseTest { public class AST2UtilTests extends AST2TestBase {
public AST2UtilTests() { public AST2UtilTests() {
} }

View file

@ -19,7 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
public class ASTCPPSpecDefectTests extends AST2BaseTest { public class ASTCPPSpecDefectTests extends AST2TestBase {
public ASTCPPSpecDefectTests() { public ASTCPPSpecDefectTests() {
} }

View file

@ -28,7 +28,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* Testcases for inactive code in ast. * Testcases for inactive code in ast.
*/ */
public class ASTInactiveCodeTests extends AST2BaseTest { public class ASTInactiveCodeTests extends AST2TestBase {
public static TestSuite suite() { public static TestSuite suite() {
return suite(ASTInactiveCodeTests.class); return suite(ASTInactiveCodeTests.class);

View file

@ -28,7 +28,7 @@ import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
public class ASTNodeSelectorTest extends AST2BaseTest { public class ASTNodeSelectorTest extends AST2TestBase {
static public TestSuite suite() { static public TestSuite suite() {
return suite(ASTNodeSelectorTest.class); return suite(ASTNodeSelectorTest.class);
@ -55,7 +55,7 @@ public class ASTNodeSelectorTest extends AST2BaseTest {
fCode= getContents(1)[0].toString(); fCode= getContents(1)[0].toString();
FileContent codeReader = FileContent.create("<test-code>", fCode.toCharArray()); FileContent codeReader = FileContent.create("<test-code>", fCode.toCharArray());
ScannerInfo scannerInfo = new ScannerInfo(); ScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, ParserLanguage.CPP, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, ParserLanguage.CPP, ParserMode.COMPLETE_PARSE, scannerInfo);
GNUCPPSourceParser parser= new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE, new NullLogService(), new GPPParserExtensionConfiguration()); GNUCPPSourceParser parser= new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE, new NullLogService(), new GPPParserExtensionConfiguration());
fTu= parser.parse(); fTu= parser.parse();
fSelector= fTu.getNodeSelector(null); fSelector= fTu.getNodeSelector(null);

View file

@ -18,7 +18,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.AccessContext; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.AccessContext;
import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ParserException;
public class AccessControlTests extends AST2BaseTest { public class AccessControlTests extends AST2TestBase {
protected class AccessAssertionHelper extends BindingAssertionHelper { protected class AccessAssertionHelper extends BindingAssertionHelper {
AccessAssertionHelper(String contents) throws ParserException { AccessAssertionHelper(String contents) throws ParserException {

View file

@ -13,22 +13,22 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.CDOM; import org.eclipse.cdt.core.dom.CDOM;
import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException; import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.parser.tests.FileBasePluginTest; import org.eclipse.cdt.core.parser.tests.FileBasePluginTestCase;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class CDOMBaseTest extends FileBasePluginTest { public class CDOMTestBase extends FileBasePluginTestCase {
public CDOMBaseTest() { public CDOMTestBase() {
} }
public CDOMBaseTest(String name) { public CDOMTestBase(String name) {
super(name); super(name);
} }
public CDOMBaseTest(String name, Class className) { public CDOMTestBase(String name, Class className) {
super(name, className); super(name, className);
} }

View file

@ -26,7 +26,7 @@ import org.eclipse.core.runtime.jobs.Job;
/** /**
* @author dsteffle * @author dsteffle
*/ */
public class CodeReaderCacheTest extends CDOMBaseTest { public class CodeReaderCacheTest extends CDOMTestBase {
public CodeReaderCacheTest() { public CodeReaderCacheTest() {
} }

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
* @author Guido Zgraggen * @author Guido Zgraggen
* *
*/ */
public class CommentTests extends AST2BaseTest { public class CommentTests extends AST2TestBase {
public static TestSuite suite() { public static TestSuite suite() {
return suite(CommentTests.class); return suite(CommentTests.class);

View file

@ -1,13 +1,14 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2; package org.eclipse.cdt.core.parser.tests.ast2;
@ -102,9 +103,13 @@ public class CompleteParser2Tests extends BaseTestCase {
} }
static private class CPPNameCollector extends ASTVisitor { static private class CPPNameCollector extends ASTVisitor {
{ public CPPNameCollector() {
shouldVisitNames = true; this(false); // don't visit implicit names by default
} }
public CPPNameCollector(boolean shouldVisitImplicitNames) {
this.shouldVisitNames = true;
this.shouldVisitImplicitNames = shouldVisitImplicitNames;
}
public List nameList = new ArrayList(); public List nameList = new ArrayList();
@Override @Override
public int visit(IASTName name){ public int visit(IASTName name){
@ -141,7 +146,7 @@ public class CompleteParser2Tests extends BaseTestCase {
if (nameCollector.getName(i).resolveBinding() == binding) if (nameCollector.getName(i).resolveBinding() == binding)
count++; count++;
assertEquals(count, num); assertEquals(num, count);
} }
protected void assertInstances(CNameCollector nameCollector, IBinding binding, int num) throws Exception { protected void assertInstances(CNameCollector nameCollector, IBinding binding, int num) throws Exception {
int count = 0; int count = 0;
@ -149,7 +154,7 @@ public class CompleteParser2Tests extends BaseTestCase {
if (nameCollector.getName(i).resolveBinding() == binding) if (nameCollector.getName(i).resolveBinding() == binding)
count++; count++;
assertEquals(count, num); assertEquals(num, count);
} }
protected IASTTranslationUnit parse(String code, boolean expectedToPass, protected IASTTranslationUnit parse(String code, boolean expectedToPass,
ParserLanguage lang) throws Exception { ParserLanguage lang) throws Exception {
@ -172,7 +177,7 @@ public class CompleteParser2Tests extends BaseTestCase {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray()); FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
ScannerInfo scannerInfo = new ScannerInfo(); ScannerInfo scannerInfo = new ScannerInfo();
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
if (lang == ParserLanguage.CPP) { if (lang == ParserLanguage.CPP) {
ICPPParserExtensionConfiguration config = null; ICPPParserExtensionConfiguration config = null;
if (gcc) if (gcc)
@ -750,7 +755,7 @@ public class CompleteParser2Tests extends BaseTestCase {
} }
public void testConstructorChain() throws Exception { public void testConstructorChain() throws Exception {
IASTTranslationUnit tu = parse("int x = 5;\n class A \n{ public : \n int a; \n A() : a(x) { } };"); IASTTranslationUnit tu = parse("int x = 5;\n class A \n{ public : \n int a; \n A() : a(x) { } };");
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
@ -1053,7 +1058,7 @@ public class CompleteParser2Tests extends BaseTestCase {
} }
public void testScoping() throws Exception { public void testScoping() throws Exception {
IASTTranslationUnit tu = parse("void foo() { int x = 3; if (x == 1) { int x = 4; } else int x = 2; }"); IASTTranslationUnit tu = parse("void foo() { int x = 3; if (x == 1) { int x = 4; } else int x = 2; }");
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
@ -1098,7 +1103,7 @@ public class CompleteParser2Tests extends BaseTestCase {
} }
public void testBug42872() throws Exception { public void testBug42872() throws Exception {
IASTTranslationUnit tu = parse("struct B {}; struct D : B {}; void foo(D* dp) { B* bp = dynamic_cast<B*>(dp); }"); IASTTranslationUnit tu = parse("struct B {}; struct D : B {}; void foo(D* dp) { B* bp = dynamic_cast<B*>(dp); }");
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
tu.accept(col); tu.accept(col);
@ -1112,14 +1117,14 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testBug43503A() throws Exception { public void testBug43503A() throws Exception {
IASTTranslationUnit tu = parse("class SD_01 { void f_SD_01() {}}; int main(){ SD_01 * a = new SD_01(); a->f_SD_01(); } "); IASTTranslationUnit tu = parse("class SD_01 { void f_SD_01() {}}; int main(){ SD_01 * a = new SD_01(); a->f_SD_01(); } ");
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
assertEquals(col.size(), 8); assertEquals(col.size(), 9);
ICPPClassType SD_01 = (ICPPClassType) col.getName(0).resolveBinding(); ICPPClassType SD_01 = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod f_SD_01 = (ICPPMethod) col.getName(1).resolveBinding(); ICPPMethod f_SD_01 = (ICPPMethod) col.getName(1).resolveBinding();
ICPPConstructor ctor = SD_01.getConstructors()[0]; ICPPConstructor ctor = SD_01.getConstructors()[0];
assertInstances(col, SD_01, 2); assertInstances(col, SD_01, 3);
assertInstances(col, ctor, 1); assertInstances(col, ctor, 1);
assertInstances(col, f_SD_01, 2); assertInstances(col, f_SD_01, 2);
} }
@ -1204,10 +1209,10 @@ public class CompleteParser2Tests extends BaseTestCase {
buff.append("} \n"); buff.append("} \n");
IASTTranslationUnit tu = parse(buff.toString()); IASTTranslationUnit tu = parse(buff.toString());
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
assertEquals(col.size(), 17); assertEquals(col.size(), 18);
ICompositeType SD_02 = (ICompositeType) col.getName(0).resolveBinding(); ICompositeType SD_02 = (ICompositeType) col.getName(0).resolveBinding();
ICPPMethod f_SD_02 = (ICPPMethod) col.getName(1).resolveBinding(); ICPPMethod f_SD_02 = (ICPPMethod) col.getName(1).resolveBinding();
ICPPClassType SD_01 = (ICPPClassType) col.getName(2).resolveBinding(); ICPPClassType SD_01 = (ICPPClassType) col.getName(2).resolveBinding();
@ -1217,7 +1222,7 @@ public class CompleteParser2Tests extends BaseTestCase {
assertInstances(col, SD_02, 2); assertInstances(col, SD_02, 2);
assertInstances(col, f_SD_02, 2); assertInstances(col, f_SD_02, 2);
assertInstances(col, SD_01, 3); assertInstances(col, SD_01, 4);
assertInstances(col, ctor, 1); assertInstances(col, ctor, 1);
assertInstances(col, next, 2); assertInstances(col, next, 2);
assertInstances(col, f_SD_01, 4); assertInstances(col, f_SD_01, 4);
@ -1268,10 +1273,10 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testBug44342() throws Exception { public void testBug44342() throws Exception {
IASTTranslationUnit tu = parse("class A { void f(){} void f(int){} }; int main(){ A * a = new A(); a->f();} "); IASTTranslationUnit tu = parse("class A { void f(){} void f(int){} }; int main(){ A * a = new A(); a->f();} ");
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
assertEquals(col.size(), 10); assertEquals(col.size(), 11);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding(); ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod f1 = (ICPPMethod) col.getName(1).resolveBinding(); ICPPMethod f1 = (ICPPMethod) col.getName(1).resolveBinding();
ICPPMethod f2 = (ICPPMethod) col.getName(2).resolveBinding(); ICPPMethod f2 = (ICPPMethod) col.getName(2).resolveBinding();
@ -1279,7 +1284,7 @@ public class CompleteParser2Tests extends BaseTestCase {
ICPPConstructor ctor = A.getConstructors()[0]; ICPPConstructor ctor = A.getConstructors()[0];
IVariable a = (IVariable) col.getName(6).resolveBinding(); IVariable a = (IVariable) col.getName(6).resolveBinding();
assertInstances(col, A, 2); assertInstances(col, A, 3);
assertInstances(col, f1, 2); assertInstances(col, f1, 2);
assertInstances(col, f2, 1); assertInstances(col, f2, 1);
assertInstances(col, ctor, 1); assertInstances(col, ctor, 1);
@ -1288,7 +1293,7 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testCDesignatedInitializers() throws Exception { public void testCDesignatedInitializers() throws Exception {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
buffer.append("struct Inner { int a,b,c; };"); buffer.append("struct Inner { int a,b,c; };");
buffer.append("struct A { int x; int y[]; struct Inner innerArray[]; int z[]; };"); buffer.append("struct A { int x; int y[]; struct Inner innerArray[]; int z[]; };");
buffer.append("struct A myA = { .x = 4, .y[3] = 4, .y[4] = 3, .innerArray[0].a = 3, .innerArray[1].b = 5, .innerArray[2].c=6, .z = { 1,4,5} };"); buffer.append("struct A myA = { .x = 4, .y[3] = 4, .y[4] = 3, .innerArray[0].a = 3, .innerArray[1].b = 5, .innerArray[2].c=6, .z = { 1,4,5} };");
parse(buffer.toString(), true, ParserLanguage.C); parse(buffer.toString(), true, ParserLanguage.C);
@ -1314,7 +1319,7 @@ public class CompleteParser2Tests extends BaseTestCase {
" _Bool b; " + " _Bool b; " +
" f(b);" + " f(b);" +
" f(g((_Bool) 1) );" + " f(g((_Bool) 1) );" +
"}", "}",
true, ParserLanguage.C); true, ParserLanguage.C);
} }
@ -1337,7 +1342,7 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testBug44925() throws Exception { public void testBug44925() throws Exception {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
buffer.append("class MyClass { };"); buffer.append("class MyClass { };");
buffer.append("class MyClass myObj1;"); buffer.append("class MyClass myObj1;");
buffer.append("enum MyEnum { Item1 };"); buffer.append("enum MyEnum { Item1 };");
buffer.append("enum MyEnum myObj2;"); buffer.append("enum MyEnum myObj2;");
@ -1420,23 +1425,23 @@ public class CompleteParser2Tests extends BaseTestCase {
buffer.append("void main() { N::A * a = new N::A(); a->f(); } "); buffer.append("void main() { N::A * a = new N::A(); a->f(); } ");
IASTTranslationUnit tu = parse(buffer.toString()); IASTTranslationUnit tu = parse(buffer.toString());
CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector(true);
tu.accept(col); tu.accept(col);
assertEquals(col.size(), 13); assertEquals(col.size(), 14);
ICPPNamespace N = (ICPPNamespace) col.getName(0).resolveBinding(); ICPPNamespace N = (ICPPNamespace) col.getName(0).resolveBinding();
IFunction f = (IFunction) col.getName(1).resolveBinding(); IFunction f = (IFunction) col.getName(1).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(2).resolveBinding(); ICPPClassType A = (ICPPClassType) col.getName(2).resolveBinding();
ICPPConstructor ctor = A.getConstructors()[0]; ICPPConstructor ctor = A.getConstructors()[0];
IProblemBinding fp = (IProblemBinding) col.getName(12).resolveBinding(); IProblemBinding fp = (IProblemBinding) col.getName(13).resolveBinding();
assertEquals(fp.getID(), IProblemBinding.SEMANTIC_NAME_NOT_FOUND); assertEquals(fp.getID(), IProblemBinding.SEMANTIC_NAME_NOT_FOUND);
assertInstances(col, N, 3); assertInstances(col, N, 3);
assertInstances(col, f, 1); assertInstances(col, f, 1);
assertInstances(col, A, 3); assertInstances(col, A, 5);
assertInstances(col, ctor, 2); assertInstances(col, ctor, 1);
} }
public void testBug43110() throws Exception { public void testBug43110() throws Exception {
@ -1994,7 +1999,7 @@ public class CompleteParser2Tests extends BaseTestCase {
writer.write("int main(int argc, char **argv) {\n"); writer.write("int main(int argc, char **argv) {\n");
writer.write("FILE * file = 0;\n"); writer.write("FILE * file = 0;\n");
writer.write("static_function(file);\n"); writer.write("static_function(file);\n");
writer.write("return 0;\n"); writer.write("return 0;\n");
writer.write("}\n"); writer.write("}\n");
parse(writer.toString()); parse(writer.toString());
} }
@ -2046,8 +2051,8 @@ public class CompleteParser2Tests extends BaseTestCase {
writer.write("};\n"); writer.write("};\n");
writer.write("\n"); writer.write("\n");
writer.write("template<typename T>\n"); writer.write("template<typename T>\n");
writer.write("inline T526026< T >\n"); writer.write("inline T526026< T >\n");
writer.write("operator+(typename T526026<T>::diff d, const T526026<T> & x)\n"); writer.write("operator+(typename T526026<T>::diff d, const T526026<T> & x)\n");
writer.write("{ return T526026< T >(); }\n"); writer.write("{ return T526026< T >(); }\n");
writer.write("}\n"); writer.write("}\n");
parse(writer.toString(), false); parse(writer.toString(), false);
@ -2055,7 +2060,7 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testBug71094() throws Exception { public void testBug71094() throws Exception {
Writer writer = new StringWriter(); Writer writer = new StringWriter();
writer.write("using namespace DOESNOTEXIST;\n"); writer.write("using namespace DOESNOTEXIST;\n");
writer.write("class A { int x; };\n"); writer.write("class A { int x; };\n");
parse(writer.toString(), false); parse(writer.toString(), false);
} }
@ -2223,7 +2228,7 @@ public class CompleteParser2Tests extends BaseTestCase {
public void testBug74328() throws Exception { public void testBug74328() throws Exception {
Writer writer = new StringWriter(); Writer writer = new StringWriter();
writer.write("int\n"); writer.write("int\n");
writer.write("main(int argc, char **argv) {\n"); writer.write("main(int argc, char **argv) {\n");
writer.write(" char *sign;\n"); writer.write(" char *sign;\n");
writer.write("sign = \"\"; // IProblem generated here, syntax error\n"); writer.write("sign = \"\"; // IProblem generated here, syntax error\n");

View file

@ -19,7 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
* @author jcamelon * @author jcamelon
* *
*/ */
public class DOMGCCSelectionParseExtensionsTest extends DOMSelectionParseBaseTest { public class DOMGCCSelectionParseExtensionsTest extends DOMSelectionParseTestBase {
public DOMGCCSelectionParseExtensionsTest() { public DOMGCCSelectionParseExtensionsTest() {
} }

View file

@ -44,7 +44,7 @@ import org.eclipse.core.runtime.content.IContentType;
/** /**
* @author jcamelon * @author jcamelon
*/ */
public class DOMLocationInclusionTests extends AST2FileBasePluginTest { public class DOMLocationInclusionTests extends AST2FileBasePluginTestCase {
public DOMLocationInclusionTests() { public DOMLocationInclusionTests() {
} }

View file

@ -35,7 +35,7 @@ import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ParserException;
public class DOMLocationMacroTests extends AST2BaseTest { public class DOMLocationMacroTests extends AST2TestBase {
final ParserLanguage[] languages = new ParserLanguage[] { ParserLanguage.C, ParserLanguage.CPP }; final ParserLanguage[] languages = new ParserLanguage[] { ParserLanguage.C, ParserLanguage.CPP };

View file

@ -73,7 +73,7 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
/** /**
* @author jcamelon * @author jcamelon
*/ */
public class DOMLocationTests extends AST2BaseTest { public class DOMLocationTests extends AST2TestBase {
public DOMLocationTests() { public DOMLocationTests() {
} }

View file

@ -32,7 +32,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
* @author Emanuel Graf * @author Emanuel Graf
* *
*/ */
public class DOMPreprocessorInformationTest extends AST2BaseTest { public class DOMPreprocessorInformationTest extends AST2TestBase {
public void testPragma() throws Exception { public void testPragma() throws Exception {
String msg = "GCC poison printf sprintf fprintf"; String msg = "GCC poison printf sprintf fprintf";

View file

@ -23,16 +23,16 @@ import org.eclipse.core.resources.IFile;
* @author johnc * @author johnc
* *
*/ */
public class DOMSelectionParseBaseTest extends DOMFileBasePluginTest { public class DOMSelectionParseTestBase extends DOMFileBasePluginTest {
public DOMSelectionParseBaseTest() { public DOMSelectionParseTestBase() {
} }
public DOMSelectionParseBaseTest(String name) { public DOMSelectionParseTestBase(String name) {
super(name); super(name);
} }
public DOMSelectionParseBaseTest(String name, Class className) { public DOMSelectionParseTestBase(String name, Class className) {
super(name, className); super(name, className);
} }

View file

@ -30,7 +30,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* Testcases related to recovery from invalid syntax. * Testcases related to recovery from invalid syntax.
*/ */
public class FaultToleranceTests extends AST2BaseTest { public class FaultToleranceTests extends AST2TestBase {
public static TestSuite suite() { public static TestSuite suite() {
return suite(FaultToleranceTests.class); return suite(FaultToleranceTests.class);

View file

@ -31,7 +31,7 @@ import org.eclipse.cdt.internal.core.dom.parser.c.CFunction;
import org.eclipse.cdt.internal.core.model.ASTStringUtil; import org.eclipse.cdt.internal.core.model.ASTStringUtil;
import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ParserException;
public class GCCCompleteParseExtensionsTest extends AST2BaseTest { public class GCCCompleteParseExtensionsTest extends AST2TestBase {
public GCCCompleteParseExtensionsTest() { public GCCCompleteParseExtensionsTest() {
} }

View file

@ -29,7 +29,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* @author aniefer * @author aniefer
*/ */
public class GCCTests extends AST2BaseTest { public class GCCTests extends AST2TestBase {
public GCCTests() { public GCCTests() {
} }

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* @author jcamelon * @author jcamelon
*/ */
public class ImageLocationTests extends AST2BaseTest { public class ImageLocationTests extends AST2TestBase {
private static final int CODE = IASTImageLocation.REGULAR_CODE; private static final int CODE = IASTImageLocation.REGULAR_CODE;
private static final int MACRO = IASTImageLocation.MACRO_DEFINITION; private static final int MACRO = IASTImageLocation.MACRO_DEFINITION;

View file

@ -44,7 +44,7 @@ import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
/** /**
* Testcases for non-gnu language extensions. * Testcases for non-gnu language extensions.
*/ */
public class LanguageExtensionsTest extends AST2BaseTest { public class LanguageExtensionsTest extends AST2TestBase {
protected static final int SIZEOF_EXTENSION = 0x1; protected static final int SIZEOF_EXTENSION = 0x1;
protected static final int FUNCTION_STYLE_ASM = 0x2; protected static final int FUNCTION_STYLE_ASM = 0x2;

View file

@ -1335,7 +1335,7 @@ public class QuickParser2Tests extends TestCase {
ParserLanguage lang, boolean gcc) throws Exception { ParserLanguage lang, boolean gcc) throws Exception {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray()); FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
IScannerInfo scannerInfo = new ScannerInfo(); IScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
if (lang == ParserLanguage.CPP) { if (lang == ParserLanguage.CPP) {
ICPPParserExtensionConfiguration config = null; ICPPParserExtensionConfiguration config = null;

View file

@ -20,7 +20,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
/** /**
* Directly tests parts of the semantics package * Directly tests parts of the semantics package
*/ */
public class SemanticsTests extends AST2BaseTest { public class SemanticsTests extends AST2TestBase {
public SemanticsTests() {} public SemanticsTests() {}
public SemanticsTests(String name) { super(name); } public SemanticsTests(String name) { super(name); }

View file

@ -18,7 +18,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.pdom.indexer.TodoTaskParser; import org.eclipse.cdt.internal.core.pdom.indexer.TodoTaskParser;
import org.eclipse.cdt.internal.core.pdom.indexer.TodoTaskParser.Task; import org.eclipse.cdt.internal.core.pdom.indexer.TodoTaskParser.Task;
public class TaskParserTest extends AST2BaseTest { public class TaskParserTest extends AST2TestBase {
public static TestSuite suite() { public static TestSuite suite() {
return suite(TaskParserTest.class); return suite(TaskParserTest.class);

View file

@ -0,0 +1,36 @@
/*******************************************************************************
* Copyright (c) 2013 Nathan Ridge.
* 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:
* Nathan Ridge - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.ast.IASTImplicitName;
import org.eclipse.cdt.core.dom.ast.IASTImplicitNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
public class TestUtil {
/**
* Searches the AST upward from the given starting node to find the
* nearest IASTImplicitNameOwner and returns its first implicit name,
* or null if it has no implicit names.
*/
public static IASTName findImplicitName(IASTNode node) {
while (node != null) {
if (node instanceof IASTImplicitNameOwner) {
IASTImplicitName[] implicitNames = ((IASTImplicitNameOwner) node).getImplicitNames();
if (implicitNames != null && implicitNames.length > 0) {
return implicitNames[0];
}
}
node = node.getParent();
}
return null;
}
}

View file

@ -21,7 +21,7 @@ import org.eclipse.cdt.internal.core.parser.ParserException;
/** /**
* Tests for ClassTypeHelper class. * Tests for ClassTypeHelper class.
*/ */
public class TypeTraitsTests extends AST2BaseTest { public class TypeTraitsTests extends AST2TestBase {
public TypeTraitsTests() { public TypeTraitsTests() {
} }

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
/** /**
* Unit tests for CPPVariableReadWriteFlags and CVariableReadWriteFlags classes. * Unit tests for CPPVariableReadWriteFlags and CVariableReadWriteFlags classes.
*/ */
public class VariableReadWriteFlagsTest extends AST2BaseTest { public class VariableReadWriteFlagsTest extends AST2TestBase {
private static final int READ = PDOMName.READ_ACCESS; private static final int READ = PDOMName.READ_ACCESS;
private static final int WRITE = PDOMName.WRITE_ACCESS; private static final int WRITE = PDOMName.WRITE_ACCESS;

View file

@ -38,7 +38,7 @@ import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.tests.ast2.AST2BaseTest; import org.eclipse.cdt.core.parser.tests.ast2.AST2TestBase;
import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
@ -53,7 +53,7 @@ public class CompletionTestBase extends BaseTestCase {
protected IASTCompletionNode getCompletionNode(String code, ParserLanguage lang, boolean useGNUExtensions) throws ParserException { protected IASTCompletionNode getCompletionNode(String code, ParserLanguage lang, boolean useGNUExtensions) throws ParserException {
FileContent codeReader = FileContent.create("<test-code>", code.trim().toCharArray()); FileContent codeReader = FileContent.create("<test-code>", code.trim().toCharArray());
ScannerInfo scannerInfo = new ScannerInfo(); ScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner= AST2TestBase.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser = null; ISourceCodeParser parser = null;
if( lang == ParserLanguage.CPP ) if( lang == ParserLanguage.CPP )

View file

@ -28,7 +28,7 @@ import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.tests.ast2.AST2BaseTest; import org.eclipse.cdt.core.parser.tests.ast2.AST2TestBase;
import org.eclipse.cdt.core.parser.tests.rewrite.RewriteBaseTest; import org.eclipse.cdt.core.parser.tests.rewrite.RewriteBaseTest;
import org.eclipse.cdt.core.parser.tests.rewrite.TestHelper; import org.eclipse.cdt.core.parser.tests.rewrite.TestHelper;
import org.eclipse.cdt.core.parser.tests.rewrite.TestSourceFile; import org.eclipse.cdt.core.parser.tests.rewrite.TestSourceFile;
@ -95,7 +95,7 @@ public class ASTWriterTest extends RewriteBaseTest {
ParserLanguage language = getLanguage(testFile); ParserLanguage language = getLanguage(testFile);
boolean useGNUExtensions = getGNUExtension(testFile); boolean useGNUExtensions = getGNUExtension(testFile);
IScanner scanner = AST2BaseTest.createScanner(codeReader, language, ParserMode.COMPLETE_PARSE, scannerInfo); IScanner scanner = AST2TestBase.createScanner(codeReader, language, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser = null; ISourceCodeParser parser = null;
if (language == ParserLanguage.CPP) { if (language == ParserLanguage.CPP) {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2012 Symbian Software Systems and others. * Copyright (c) 2006, 2013 Symbian Software Systems 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 @@
* IBM Corporation * IBM Corporation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.index.tests; package org.eclipse.cdt.internal.index.tests;
@ -83,7 +84,7 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
super.tearDown(); super.tearDown();
} }
protected IASTName findName(String section, int len) { protected IASTName findName(String section, int len, boolean preferImplicitName) {
if (len == 0) if (len == 0)
len= section.length(); len= section.length();
for (int i = 0; i < strategy.getAstCount(); i++) { for (int i = 0; i < strategy.getAstCount(); i++) {
@ -91,15 +92,27 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
final IASTNodeSelector nodeSelector = ast.getNodeSelector(null); final IASTNodeSelector nodeSelector = ast.getNodeSelector(null);
final int offset = strategy.getAstSource(i).indexOf(section); final int offset = strategy.getAstSource(i).indexOf(section);
if (offset >= 0) { if (offset >= 0) {
IASTName name= nodeSelector.findName(offset, len); if (preferImplicitName) {
if (name == null) return nodeSelector.findImplicitName(offset, len);
name= nodeSelector.findImplicitName(offset, len); } else {
return name; IASTName name= nodeSelector.findName(offset, len);
if (name == null)
name= nodeSelector.findImplicitName(offset, len);
return name;
}
} }
} }
return null; return null;
} }
protected IASTName findName(String section, int len) {
return findName(section, len, false);
}
protected IASTName findImplicitName(String section, int len) {
return findName(section, len, true);
}
/** /**
* Attempts to get an IBinding from the initial specified number of characters * Attempts to get an IBinding from the initial specified number of characters
@ -129,9 +142,37 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
assertInstance(binding, clazz, cs); assertInstance(binding, clazz, cs);
return clazz.cast(binding); return clazz.cast(binding);
} }
/**
* Attempts to get an IBinding attached to an implicit name from the initial specified
* number of characters from the specified code fragment. Fails the test if
* <ul>
* <li> There is not a unique implicit name with the specified criteria
* <li> The binding associated with the implicit name is null or a problem binding
* <li> The binding is not an instance of the specified class
* </ul>
* @param section the code fragment to search for in the AST. The first occurrence of an identical section is used.
* @param len the length of the specified section to use as a name
* @param clazz an expected class type or interface that the binding should extend/implement
* @return the associated implicit name's binding
*/
protected <T> T getBindingFromImplicitASTName(String section, int len, Class<T> clazz, Class ... cs) {
if (len < 1) {
len= section.length()+len;
}
IASTName name= findImplicitName(section, len);
assertNotNull("Name not found for \"" + section + "\"", name);
assertEquals(section.substring(0, len), name.getRawSignature());
IBinding binding = name.resolveBinding();
assertNotNull("No binding for " + name.getRawSignature(), binding);
assertFalse("Binding is a ProblemBinding for name \"" + name.getRawSignature() + "\"", IProblemBinding.class.isAssignableFrom(name.resolveBinding().getClass()));
assertInstance(binding, clazz, cs);
return clazz.cast(binding);
}
/* /*
* @see IndexBindingResolutionTestBase#getBindingFromASTName(Class, String, int) * @see IndexBindingResolutionTestBase#getBindingFromASTName(String, int, Class<T>, Class ...)
*/ */
protected <T extends IBinding> T getBindingFromASTName(String section, int len) { protected <T extends IBinding> T getBindingFromASTName(String section, int len) {
if (len <= 0) if (len <= 0)
@ -146,6 +187,23 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
assertFalse("Binding is a ProblemBinding for name \"" + name.getRawSignature() + "\"", IProblemBinding.class.isAssignableFrom(name.resolveBinding().getClass())); assertFalse("Binding is a ProblemBinding for name \"" + name.getRawSignature() + "\"", IProblemBinding.class.isAssignableFrom(name.resolveBinding().getClass()));
return (T) binding; return (T) binding;
} }
/*
* @see IndexBindingResolutionTestBase#getBindingFromImplicitASTName(String, int, Class<T>, Class ...)
*/
protected <T extends IBinding> T getBindingFromImplicitASTName(String section, int len) {
if (len <= 0)
len += section.length();
IASTName name= findImplicitName(section, len);
assertNotNull("Name not found for \"" + section + "\"", name);
assertEquals(section.substring(0, len), name.getRawSignature());
IBinding binding = name.resolveBinding();
assertNotNull("No binding for " + name.getRawSignature(), binding);
assertFalse("Binding is a ProblemBinding for name \"" + name.getRawSignature() + "\"", IProblemBinding.class.isAssignableFrom(name.resolveBinding().getClass()));
return (T) binding;
}
/** /**
* Attempts to verify that the resolved binding for a name is a problem binding. * Attempts to verify that the resolved binding for a name is a problem binding.

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2013 Wind River Systems, Inc. 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
@ -8,6 +8,7 @@
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Andrew Ferguson (Symbian) * Andrew Ferguson (Symbian)
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.index.tests; package org.eclipse.cdt.internal.index.tests;
@ -42,20 +43,20 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
public ProjectWithDepProj() { setStrategy(new ReferencedProject(false)); } public ProjectWithDepProj() { setStrategy(new ReferencedProject(false)); }
public static TestSuite suite() { return suite(ProjectWithDepProj.class); } public static TestSuite suite() { return suite(ProjectWithDepProj.class); }
} }
public static void addTests(TestSuite suite) { public static void addTests(TestSuite suite) {
suite.addTest(SingleProject.suite()); suite.addTest(SingleProject.suite());
suite.addTest(ProjectWithDepProj.suite()); suite.addTest(ProjectWithDepProj.suite());
} }
// #include <stdio.h> // #include <stdio.h>
// void func1(void) { // void func1(void) {
// int i = 0; // int i = 0;
// for (i=0; i<10;i++) { // for (i=0; i<10;i++) {
// printf("%i", i); // printf("%i", i);
// } // }
// } // }
// #include "header.h" // #include "header.h"
// //
// int main(void) { // int main(void) {
@ -77,7 +78,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
} }
// void func1(void); // void func1(void);
// #include "header.h" // #include "header.h"
// //
// int main(void) { // int main(void) {
@ -87,7 +88,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
IBinding b0 = getBindingFromASTName("func1;", 5); IBinding b0 = getBindingFromASTName("func1;", 5);
assertTrue(b0 instanceof IFunction); assertTrue(b0 instanceof IFunction);
} }
// typedef struct { // typedef struct {
// int utm; // int utm;
// } usertype; // } usertype;
@ -132,7 +133,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertInstance(type, IEnumeration.class); assertInstance(type, IEnumeration.class);
assertTrue(type instanceof IEnumeration); assertTrue(type instanceof IEnumeration);
} }
// int globalVar; // int globalVar;
// // don't include header // // don't include header
@ -268,10 +269,10 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
e= (IEnumeration) b1; e= (IEnumeration) b1;
ei= e.getEnumerators(); ei= e.getEnumerators();
assertEquals(1, ei.length); assertEquals(1, ei.length);
} }
// // no header needed // // no header needed
// typedef struct { // typedef struct {
// int member; // int member;
// } t_struct; // } t_struct;
@ -289,7 +290,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(tdIndex instanceof IIndexBinding); assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef); assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef); assertTrue(tdIndex instanceof ITypedef);
IType tAST= ((ITypedef) tdAST).getType(); IType tAST= ((ITypedef) tdAST).getType();
IType tIndex= ((ITypedef) tdIndex).getType(); IType tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof ICompositeType); assertTrue(tAST instanceof ICompositeType);
@ -304,7 +305,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(tdIndex instanceof IIndexBinding); assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef); assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef); assertTrue(tdIndex instanceof ITypedef);
tAST= ((ITypedef) tdAST).getType(); tAST= ((ITypedef) tdAST).getType();
tIndex= ((ITypedef) tdIndex).getType(); tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof ICompositeType); assertTrue(tAST instanceof ICompositeType);
@ -319,7 +320,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(tdIndex instanceof IIndexBinding); assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef); assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef); assertTrue(tdIndex instanceof ITypedef);
tAST= ((ITypedef) tdAST).getType(); tAST= ((ITypedef) tdAST).getType();
tIndex= ((ITypedef) tdIndex).getType(); tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof IEnumeration); assertTrue(tAST instanceof IEnumeration);
@ -327,13 +328,13 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(tAST.isSameType(tIndex)); assertTrue(tAST.isSameType(tIndex));
assertTrue(tIndex.isSameType(tAST)); assertTrue(tIndex.isSameType(tAST));
} }
// struct outer { // struct outer {
// union { // union {
// int var1; // int var1;
// }; // };
// }; // };
// #include "header.h" // #include "header.h"
// void test() { // void test() {
// struct outer x; // struct outer x;
@ -354,7 +355,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
// int var1; // int var1;
// }; // };
// }; // };
// #include "header.h" // #include "header.h"
// void test() { // void test() {
// union outer x; // union outer x;
@ -369,14 +370,14 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(outer instanceof ICCompositeTypeScope); assertTrue(outer instanceof ICCompositeTypeScope);
assertEquals("outer", outer.getScopeName().toString()); assertEquals("outer", outer.getScopeName().toString());
} }
// int myFunc(); // int myFunc();
// int myFunc(var) // int myFunc(var)
// int var; // int var;
// { // {
// return var; // return var;
// } // }
// int main(void) { // int main(void) {
// return myFunc(0); // return myFunc(0);
// } // }
@ -390,7 +391,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
assertTrue(params[0].getType() instanceof IBasicType); assertTrue(params[0].getType() instanceof IBasicType);
assertEquals(IBasicType.Kind.eInt, ((IBasicType) params[0].getType()).getKind()); assertEquals(IBasicType.Kind.eInt, ((IBasicType) params[0].getType()).getKind());
} }
// typedef struct S S; // typedef struct S S;
// void setValue(S *pSelf, int value); // void setValue(S *pSelf, int value);
@ -404,7 +405,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
IBinding b = getBindingFromASTName("value =", 5); IBinding b = getBindingFromASTName("value =", 5);
assertTrue(b instanceof IField); assertTrue(b instanceof IField);
} }
// void f255( // void f255(
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, // int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, // int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
@ -439,8 +440,8 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, // int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, // int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int); // int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
// void test() { // void test() {
// f255( // f255(
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -463,8 +464,8 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
public void testFunctionsWithManyParameters_Bug319186() throws Exception { public void testFunctionsWithManyParameters_Bug319186() throws Exception {
getBindingFromASTName("f255", 0); getBindingFromASTName("f255", 0);
getBindingFromASTName("f256", 0); getBindingFromASTName("f256", 0);
} }
// struct B { // struct B {
// float f; // float f;
// }; // };
@ -474,5 +475,17 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase
// }; // };
public void testDesignatedInitializer_Bug210019() throws Exception { public void testDesignatedInitializer_Bug210019() throws Exception {
IField f= getBindingFromASTName("f", 0); IField f= getBindingFromASTName("f", 0);
} }
// struct S {
// int data;
// };
// void test(void (*f)(void*)) {
// struct S *i;
// f(&i->data);
// }
public void testBug394151() throws Exception {
IParameter f= getBindingFromASTName("f(", 1);
}
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2010 Symbian Software Systems and others. * Copyright (c) 2007, 2013 Symbian Software Systems 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
@ -9,6 +9,7 @@
* Andrew Ferguson (Symbian) - Initial implementation * Andrew Ferguson (Symbian) - Initial implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.index.tests; package org.eclipse.cdt.internal.index.tests;
@ -1490,9 +1491,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
assertFalse(b0 instanceof IIndexBinding); assertFalse(b0 instanceof IIndexBinding);
ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class); ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class);
assertFalse(b1 instanceof IIndexBinding); assertFalse(b1 instanceof IIndexBinding);
ICPPConstructor b2 = getBindingFromASTName("B(0)", 1, ICPPConstructor.class); ICPPClassType b2 = getBindingFromASTName("B(0)", 1, ICPPClassType.class);
assertFalse(b2 instanceof IIndexBinding);
assertEquals(b1, b2);
ICPPMethod b3 = getBindingFromASTName("m(0)", 1, ICPPMethod.class); ICPPMethod b3 = getBindingFromASTName("m(0)", 1, ICPPMethod.class);
assertFalse(b3 instanceof IIndexBinding); assertFalse(b3 instanceof IIndexBinding);
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2012 Symbian Software Systems and others. * Copyright (c) 2007, 2013 Symbian Software Systems 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
@ -300,7 +300,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
// X<A> xa= new X<A>(); // X<A> xa= new X<A>();
// } // }
public void testUnindexedConstructorInstance() { public void testUnindexedConstructorInstance() {
IBinding b0= getBindingFromASTName("X<A>()", 4); IBinding b0= getBindingFromImplicitASTName("X<A>()", 4);
assertInstance(b0, ICPPConstructor.class); assertInstance(b0, ICPPConstructor.class);
} }
@ -409,7 +409,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
// assertEquals(3, _ctcs.length); // two implicit plus the constructor template // assertEquals(3, _ctcs.length); // two implicit plus the constructor template
IBinding b2= getBindingFromASTName("D<int>(", 1); IBinding b2= getBindingFromASTName("D<int>(", 1);
IBinding b3= getBindingFromASTName("D<int>(", 6); IBinding b3= getBindingFromImplicitASTName("D<int>(", 6);
assertInstance(b2, ICPPClassTemplate.class); // *D*<int>(5, 6) assertInstance(b2, ICPPClassTemplate.class); // *D*<int>(5, 6)
assertInstance(b2, ICPPClassType.class); // *D*<int>(5, 6) assertInstance(b2, ICPPClassType.class); // *D*<int>(5, 6)

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others. * Copyright (c) 2005, 2013 IBM Corporation 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
@ -45,6 +45,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownMemberClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownMemberClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.TypeOfDependentExpression;
/** /**
* This is a utility class to help convert AST elements to Strings corresponding to * This is a utility class to help convert AST elements to Strings corresponding to
@ -408,6 +409,8 @@ public class ASTTypeUtil {
IQualifierType qt= (IQualifierType) type; IQualifierType qt= (IQualifierType) type;
needSpace= appendCVQ(result, needSpace, qt.isConst(), qt.isVolatile(), false); needSpace= appendCVQ(result, needSpace, qt.isConst(), qt.isVolatile(), false);
} else if (type instanceof TypeOfDependentExpression) {
result.append(((TypeOfDependentExpression) type).getSignature());
} else if (type instanceof ISemanticProblem) { } else if (type instanceof ISemanticProblem) {
result.append('?'); result.append('?');
} else if (type != null) { } else if (type != null) {
@ -584,7 +587,7 @@ public class ASTTypeUtil {
if (parenthesis == null) { if (parenthesis == null) {
parenthesis= new BitSet(); parenthesis= new BitSet();
} }
parenthesis.set(postfix.size()-1); parenthesis.set(postfix.size() - 1);
} }
appendTypeString(tj, normalize, result); appendTypeString(tj, normalize, result);
needParenthesis= false; needParenthesis= false;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2008, 2011 Wind River Systems, Inc. and others. * Copyright (c) 2008, 2013 Wind River Systems, Inc. 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
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser; package org.eclipse.cdt.internal.core.dom.parser;
@ -33,11 +34,11 @@ public abstract class ASTEnumerator extends ASTNode implements IASTEnumerator, I
setName(name); setName(name);
setValue(value); setValue(value);
} }
protected void copyAbstractEnumerator(ASTEnumerator copy, CopyStyle style) { protected <T extends ASTEnumerator> T copy(T copy, CopyStyle style) {
copy.setName(name == null ? null : name.copy(style)); copy.setName(name == null ? null : name.copy(style));
copy.setValue(value == null ? null : value.copy(style)); copy.setValue(value == null ? null : value.copy(style));
copy.setOffsetAndLength(this); return super.copy(copy, style);
} }
@Override @Override
@ -125,23 +126,26 @@ public abstract class ASTEnumerator extends ASTNode implements IASTEnumerator, I
} }
private void createEnumValues(IASTEnumerationSpecifier parent) { private void createEnumValues(IASTEnumerationSpecifier parent) {
IValue previousExplicitValue = null;
int delta = 0;
IASTEnumerator[] etors= parent.getEnumerators(); IASTEnumerator[] etors= parent.getEnumerators();
long cv= -1;
boolean isknown= true;
for (IASTEnumerator etor : etors) { for (IASTEnumerator etor : etors) {
cv++; IValue val;
IASTExpression expr= etor.getValue(); IASTExpression expr= etor.getValue();
if (expr != null) { if (expr != null) {
IValue val= Value.create(expr, Value.MAX_RECURSION_DEPTH); val= Value.create(expr, Value.MAX_RECURSION_DEPTH);
Long nv= val.numericalValue(); previousExplicitValue = val;
isknown= false; delta = 1;
if (nv != null) { } else {
isknown= true; if (previousExplicitValue != null) {
cv= nv.longValue(); val = Value.incrementedValue(previousExplicitValue, delta);
} else {
val = Value.create(delta);
} }
delta++;
} }
if (etor instanceof ASTEnumerator) { if (etor instanceof ASTEnumerator) {
((ASTEnumerator) etor).integralValue= isknown ? Value.create(cv) : Value.UNKNOWN; ((ASTEnumerator) etor).integralValue= val;
} }
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2011 Google, Inc and others. * Copyright (c) 2011, 2013 Google, Inc 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
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Sergey Prigogin (Google) - initial API and implementation * Sergey Prigogin (Google) - initial API and implementation
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser; package org.eclipse.cdt.internal.core.dom.parser;
@ -129,7 +130,11 @@ public class SizeofCalculator {
sizeof_long_long = getSize(sizeofMacros, "__SIZEOF_LONG_LONG__", maxAlignment); //$NON-NLS-1$ sizeof_long_long = getSize(sizeofMacros, "__SIZEOF_LONG_LONG__", maxAlignment); //$NON-NLS-1$
sizeof_int128 = getSize(sizeofMacros, "__SIZEOF_INT128__", maxAlignment); //$NON-NLS-1$ sizeof_int128 = getSize(sizeofMacros, "__SIZEOF_INT128__", maxAlignment); //$NON-NLS-1$
sizeof_short = getSize(sizeofMacros, "__SIZEOF_SHORT__", maxAlignment); //$NON-NLS-1$ sizeof_short = getSize(sizeofMacros, "__SIZEOF_SHORT__", maxAlignment); //$NON-NLS-1$
sizeof_bool = getSize(sizeofMacros, "__SIZEOF_BOOL__", maxAlignment); //$NON-NLS-1$ SizeAndAlignment size = getSize(sizeofMacros, "__SIZEOF_BOOL__", maxAlignment); //$NON-NLS-1$
// __SIZEOF_BOOL__ is not defined by GCC but sizeof(bool) is needed for template resolution.
if (size == null)
size = SIZE_1;
sizeof_bool = size;
sizeof_wchar_t = getSize(sizeofMacros, "__SIZEOF_WCHAR_T__", maxAlignment); //$NON-NLS-1$ sizeof_wchar_t = getSize(sizeofMacros, "__SIZEOF_WCHAR_T__", maxAlignment); //$NON-NLS-1$
sizeof_float = getSize(sizeofMacros, "__SIZEOF_FLOAT__", maxAlignment); //$NON-NLS-1$ sizeof_float = getSize(sizeofMacros, "__SIZEOF_FLOAT__", maxAlignment); //$NON-NLS-1$
sizeof_complex_float = getSizeOfPair(sizeof_float); sizeof_complex_float = getSizeOfPair(sizeof_float);
@ -152,7 +157,7 @@ public class SizeofCalculator {
sizeof_long_long = null; sizeof_long_long = null;
sizeof_int128 = size_16; sizeof_int128 = size_16;
sizeof_short = null; sizeof_short = null;
sizeof_bool = null; sizeof_bool = SIZE_1;
sizeof_wchar_t = null; sizeof_wchar_t = null;
sizeof_float = null; sizeof_float = null;
sizeof_complex_float = null; sizeof_complex_float = null;
@ -178,7 +183,12 @@ public class SizeofCalculator {
if (type instanceof IBasicType) { if (type instanceof IBasicType) {
return sizeAndAlignment((IBasicType) type); return sizeAndAlignment((IBasicType) type);
} }
if (type instanceof IPointerType || type instanceof ICPPReferenceType) { // [expr.sizeof]/2: "When applied to a reference or a reference type, the
// result is the size of the referenced type."
if (type instanceof ICPPReferenceType) {
return sizeAndAlignment(((ICPPReferenceType) type).getType());
}
if (type instanceof IPointerType) {
if (type instanceof ICPPPointerToMemberType) if (type instanceof ICPPPointerToMemberType)
return null; return null;
return sizeof_pointer; return sizeof_pointer;
@ -310,14 +320,24 @@ public class SizeofCalculator {
if (field.isStatic()) if (field.isStatic())
continue; continue;
IType fieldType = field.getType(); IType fieldType = field.getType();
SizeAndAlignment info = sizeAndAlignment(fieldType); SizeAndAlignment info;
// sizeof() on a reference type returns the size of the referenced type.
// However, a reference field in a structure only occupies as much space
// as a pointer.
if (fieldType instanceof ICPPReferenceType) {
info = sizeof_pointer;
} else {
info = sizeAndAlignment(fieldType);
}
if (info == null) if (info == null)
return null; return null;
if (union) { if (union) {
if (size < info.size) if (size < info.size)
size = info.size; size = info.size;
} else { } else {
size += info.alignment - (size - 1) % info.alignment - 1 + info.size; if (size > 0)
size += info.alignment - (size - 1) % info.alignment - 1;
size += info.size;
} }
if (maxAlignment < info.alignment) if (maxAlignment < info.alignment)
maxAlignment = info.alignment; maxAlignment = info.alignment;

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.IASTBinaryTypeIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression; import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression; import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
@ -53,16 +54,20 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator.SizeAndAlignment; import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator.SizeAndAlignment;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalBinary;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.TypeTraits; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.TypeTraits;
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator;
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException;
@ -77,6 +82,7 @@ public class Value implements IValue {
public static final int MAX_RECURSION_DEPTH = 25; public static final int MAX_RECURSION_DEPTH = 25;
public static final Value UNKNOWN= new Value("<unknown>".toCharArray(), null); //$NON-NLS-1$ public static final Value UNKNOWN= new Value("<unknown>".toCharArray(), null); //$NON-NLS-1$
public static final Value NOT_INITIALIZED= new Value("<__>".toCharArray(), null); //$NON-NLS-1$ public static final Value NOT_INITIALIZED= new Value("<__>".toCharArray(), null); //$NON-NLS-1$
private static final IType INT_TYPE= new CPPBasicType(ICPPBasicType.Kind.eInt, 0);
private static final Number VALUE_CANNOT_BE_DETERMINED = new Number() { private static final Number VALUE_CANNOT_BE_DETERMINED = new Number() {
@Override @Override
@ -271,6 +277,16 @@ public class Value implements IValue {
return UNKNOWN; return UNKNOWN;
} }
public static IValue incrementedValue(IValue value, int increment) {
Long val = value.numericalValue();
if (val != null) {
return create(val.longValue() + increment);
}
ICPPEvaluation arg1 = value.getEvaluation();
EvalFixed arg2 = new EvalFixed(INT_TYPE, ValueCategory.PRVALUE, create(increment));
return create(new EvalBinary(IASTBinaryExpression.op_plus, arg1, arg2));
}
private static Number applyUnaryTypeIdOperator(int operator, IType type, IASTNode point) { private static Number applyUnaryTypeIdOperator(int operator, IType type, IASTNode point) {
switch (operator) { switch (operator) {
case op_sizeof: case op_sizeof:

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2011 Wind River Systems, Inc. and others. * Copyright (c) 2007, 2013 Wind River Systems, Inc. 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
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser; package org.eclipse.cdt.internal.core.dom.parser;
@ -191,7 +192,7 @@ public abstract class VariableReadWriteFlags {
final IType type= functionNameExpression.getExpressionType(); final IType type= functionNameExpression.getExpressionType();
if (type instanceof IFunctionType) { if (type instanceof IFunctionType) {
return rwArgumentForFunctionCall((IFunctionType) type, i, indirection); return rwArgumentForFunctionCall((IFunctionType) type, i, indirection);
} else { } else if (funcCall instanceof IASTImplicitNameOwner) {
IASTImplicitName[] implicitNames = ((IASTImplicitNameOwner) funcCall).getImplicitNames(); IASTImplicitName[] implicitNames = ((IASTImplicitNameOwner) funcCall).getImplicitNames();
if (implicitNames.length == 1) { if (implicitNames.length == 1) {
IASTImplicitName name = implicitNames[0]; IASTImplicitName name = implicitNames[0];

View file

@ -1,12 +1,12 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2011 IBM Corporation and others. * Copyright (c) 2005, 2013 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* John Camelon (IBM Rational Software) - Initial API and implementation * John Camelon (IBM Rational Software) - Initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
@ -34,11 +34,6 @@ public class CASTEnumerator extends ASTEnumerator {
@Override @Override
public CASTEnumerator copy(CopyStyle style) { public CASTEnumerator copy(CopyStyle style) {
CASTEnumerator copy = new CASTEnumerator(); return copy(new CASTEnumerator(), style);
copyAbstractEnumerator(copy, style);
if (style == CopyStyle.withLocations) {
copy.setCopyLocation(this);
}
return copy;
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2008, 2011 Symbian Software Systems and others. * Copyright (c) 2008, 2013 Symbian Software Systems 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
@ -9,6 +9,7 @@
* Andrew Ferguson (Symbian) - Initial Implementation * Andrew Ferguson (Symbian) - Initial Implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* IBM Corporation * IBM Corporation
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -68,12 +69,18 @@ public class CPPASTAmbiguousTemplateArgument extends ASTAmbiguousNode implements
name.setBinding(null); name.setBinding(null);
namedTypeSpec.setName(name); namedTypeSpec.setName(name);
} }
} else if (node instanceof IASTIdExpression) { } else {
IASTIdExpression id= (IASTIdExpression) node; // Unwrap variadic pack expansion if necessary.
final IASTName name = id.getName(); if (node instanceof ICPPASTPackExpansionExpression)
name.setBinding(null); node= ((ICPPASTPackExpansionExpression) node).getPattern();
id.setName(name);
} if (node instanceof IASTIdExpression) {
IASTIdExpression id= (IASTIdExpression) node;
final IASTName name = id.getName();
name.setBinding(null);
id.setName(name);
}
}
} }
@Override @Override

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2011 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
@ -124,7 +124,7 @@ public class CPPASTBinaryTypeIdExpression extends ASTNode implements ICPPASTExpr
fEvaluation= EvalFixed.INCOMPLETE; fEvaluation= EvalFixed.INCOMPLETE;
} else { } else {
IType t1= CPPVisitor.createType(fOperand1); IType t1= CPPVisitor.createType(fOperand1);
IType t2= CPPVisitor.createType(fOperand1); IType t2= CPPVisitor.createType(fOperand2);
if (t1 == null || t2 == null) { if (t1 == null || t2 == null) {
fEvaluation= EvalFixed.INCOMPLETE; fEvaluation= EvalFixed.INCOMPLETE;
} else { } else {

View file

@ -1,13 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2011 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* John Camelon (IBM) - Initial API and implementation * John Camelon (IBM) - Initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -35,11 +35,6 @@ public class CPPASTEnumerator extends ASTEnumerator {
@Override @Override
public CPPASTEnumerator copy(CopyStyle style) { public CPPASTEnumerator copy(CopyStyle style) {
CPPASTEnumerator copy = new CPPASTEnumerator(); return copy(new CPPASTEnumerator(), style);
copyAbstractEnumerator(copy, style);
if (style == CopyStyle.withLocations) {
copy.setCopyLocation(this);
}
return copy;
} }
} }

View file

@ -1,12 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009, 2011 Wind River Systems, Inc. and others. * Copyright (c) 2009, 2013 Wind River Systems, Inc. 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Natan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPackExpansionExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPackExpansionExpression;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
@ -74,7 +76,7 @@ public class CPPASTPackExpansionExpression extends ASTNode implements ICPPASTPac
} else { } else {
type= new CPPParameterPackType(type); type= new CPPParameterPackType(type);
} }
fEvaluation= new EvalFixed(type, PRVALUE, Value.UNKNOWN); fEvaluation= new EvalFixed(type, PRVALUE, Value.create(((ICPPASTExpression) fPattern).getEvaluation()));
} }
return fEvaluation; return fEvaluation;
} }

View file

@ -1,14 +1,15 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Andrew Niefer (IBM Corporation) - initial API and implementation * Andrew Niefer (IBM Corporation) - initial API and implementation
* Bryan Wilkinson (QNX) * Bryan Wilkinson (QNX)
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -47,8 +48,10 @@ public class CPPBaseClause implements ICPPBase, ICPPInternalBase {
public IType getBaseClassType() { public IType getBaseClassType() {
if (baseClass == null) { if (baseClass == null) {
IBinding b = base.getName().resolveBinding(); IBinding b = base.getName().resolveBinding();
if (b instanceof IProblemBinding || ! (b instanceof IType)) { if (b instanceof IProblemBinding) {
baseClass = new CPPClassType.CPPClassTypeProblem(base.getName(), ((IProblemBinding) b).getID()); baseClass = new CPPClassType.CPPClassTypeProblem(base.getName(), ((IProblemBinding) b).getID());
} else if (!(b instanceof IType)) {
baseClass = new CPPClassType.CPPClassTypeProblem(base.getName(), ISemanticProblem.BINDING_NO_CLASS);
} else { } else {
baseClass= (IType) b; baseClass= (IType) b;
IType check= getNestedType(baseClass, TDEF); IType check= getNestedType(baseClass, TDEF);

View file

@ -103,7 +103,7 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP
// Function call operator // Function call operator
final IType returnType= getReturnType(); final IType returnType= getReturnType();
final IType[] parameterTypes= getParameterTypes(); final IType[] parameterTypes= getParameterTypes();
ft= new CPPFunctionType(returnType, parameterTypes, isMutable(), false, false); ft= new CPPFunctionType(returnType, parameterTypes, !isMutable(), false, false);
ICPPParameter[] params = new ICPPParameter[parameterTypes.length]; ICPPParameter[] params = new ICPPParameter[parameterTypes.length];
for (int i = 0; i < params.length; i++) { for (int i = 0; i < params.length; i++) {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2012 Wind River Systems, Inc. and others. * Copyright (c) 2012, 2013 Wind River Systems, Inc. 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
@ -8,6 +8,7 @@
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -84,8 +85,16 @@ public interface ICPPEvaluation extends ISerializableEvaluation {
IASTNode point); IASTNode point);
/** /**
* Determines size of the template parameter pack. * Searches the evaluation for a usage of a template parameter which is a parameter pack,
* and returns the number of arguments bound to that parameter pack in the given
* template parameter map.
* *
* Can also return one of the special values CPPTemplates.PACK_SIZE_DEFER,
* CPPTemplates.PACK_SIZE_FAIL, and CPPTemplates.PACK_SIZE_NOT_FOUND. See their
* declarations for their meanings.
*
* See also CPPTemplates.determinePackSize().
*
* @noreference This method is not intended to be referenced by clients. * @noreference This method is not intended to be referenced by clients.
*/ */
int determinePackSize(ICPPTemplateParameterMap tpMap); int determinePackSize(ICPPTemplateParameterMap tpMap);

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2012 Google, Inc and others. * Copyright (c) 2012, 2013 Google, Inc 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
@ -11,207 +11,18 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.Value;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
public abstract class CPPEvaluation implements ICPPEvaluation { public abstract class CPPEvaluation implements ICPPEvaluation {
private static class SignatureBuilder implements ITypeMarshalBuffer {
private static final byte NULL_TYPE= 0;
private static final byte UNSTORABLE_TYPE= (byte) -1;
private final StringBuilder fBuffer;
/**
* Constructor for input buffer.
*/
public SignatureBuilder() {
fBuffer= new StringBuilder();
}
@Override
public String toString() {
return fBuffer.toString();
}
public char[] getSignature() {
return CharArrayUtils.extractChars(fBuffer);
}
@Override
public void marshalBinding(IBinding binding) throws CoreException {
if (binding instanceof ISerializableType) {
((ISerializableType) binding).marshal(this);
} else if (binding == null) {
putByte(NULL_TYPE);
} else {
appendSeparator();
if (binding instanceof ICPPBinding) {
if (binding instanceof ICPPTemplateParameter) {
ICPPTemplateParameter param = (ICPPTemplateParameter) binding;
fBuffer.append(param.isParameterPack() ? '*' : '#');
fBuffer.append(param.getParameterID());
} else {
fBuffer.append(ASTTypeUtil.getQualifiedName((ICPPBinding) binding));
}
} else {
fBuffer.append(binding.getNameCharArray());
}
}
}
@Override
public void marshalType(IType type) throws CoreException {
if (type instanceof ISerializableType) {
((ISerializableType) type).marshal(this);
} else if (type == null) {
putByte(NULL_TYPE);
} else if (type instanceof IBinding) {
marshalBinding((IBinding) type);
} else {
assert false : "Cannot serialize " + ASTTypeUtil.getType(type) + " (" + type.getClass().getName() + ")"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
putByte(UNSTORABLE_TYPE);
}
}
@Override
public void marshalEvaluation(ISerializableEvaluation eval, boolean includeValues) throws CoreException {
if (eval == null) {
putByte(NULL_TYPE);
} else {
eval.marshal(this, includeValues);
}
}
@Override
public void marshalValue(IValue value) throws CoreException {
if (value instanceof Value) {
((Value) value).marshall(this);
} else {
putByte(NULL_TYPE);
}
}
@Override
public void marshalTemplateArgument(ICPPTemplateArgument arg) throws CoreException {
if (arg.isNonTypeValue()) {
putByte(VALUE);
arg.getNonTypeEvaluation().marshal(this, true);
} else {
marshalType(arg.getTypeValue());
}
}
@Override
public void putByte(byte value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putFixedInt(int value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putInt(int value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putLong(long value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putCharArray(char[] chars) {
appendSeparator();
for (char c : chars) {
fBuffer.append(c);
}
}
private void appendSeparator() {
if (fBuffer.length() != 0)
fBuffer.append(' ');
}
@Override
public IBinding unmarshalBinding() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public IType unmarshalType() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public ISerializableEvaluation unmarshalEvaluation() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public IValue unmarshalValue() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public ICPPTemplateArgument unmarshalTemplateArgument() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public int getByte() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public CoreException unmarshallingError() {
throw new UnsupportedOperationException();
}
@Override
public int getFixedInt() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public int getInt() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public long getLong() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public char[] getCharArray() throws CoreException {
throw new UnsupportedOperationException();
}
}
CPPEvaluation() { CPPEvaluation() {
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2012 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
@ -550,14 +550,6 @@ public class CPPSemantics {
if (parent instanceof ICPPASTConstructorChainInitializer) { if (parent instanceof ICPPASTConstructorChainInitializer) {
return true; return true;
} }
if (parent instanceof ICPPASTNamedTypeSpecifier) {
parent= parent.getParent();
if (parent instanceof IASTTypeId && parent.getParent() instanceof ICPPASTNewExpression) {
IASTDeclarator dtor = ((IASTTypeId) parent).getAbstractDeclarator();
if (dtor != null && dtor.getPointerOperators().length == 0)
return true;
}
}
return false; return false;
} }
@ -3103,27 +3095,43 @@ public class CPPSemantics {
return null; return null;
IType type = ((ICPPVariable) binding).getType(); IType type = ((ICPPVariable) binding).getType();
try { type = SemanticUtil.getNestedType(type, TDEF | CVTYPE);
type = SemanticUtil.getNestedType(type, TDEF | CVTYPE); if (!(type instanceof ICPPClassType))
if (!(type instanceof ICPPClassType)) return null;
return null; if (type instanceof ICPPClassTemplate || type instanceof ICPPUnknownType || type instanceof ISemanticProblem)
if (type instanceof ICPPClassTemplate || type instanceof ICPPUnknownType || type instanceof ISemanticProblem) return null;
return null;
final ICPPClassType classType = (ICPPClassType) type; return findImplicitlyCalledConstructor((ICPPClassType) type, initializer, name);
}
public static ICPPConstructor findImplicitlyCalledConstructor(ICPPASTNewExpression expr) {
IType type = getNestedType(expr.getExpressionType(), TDEF | REF | CVTYPE);
if (!(type instanceof IPointerType))
return null;
type = ((IPointerType) type).getType();
if (type instanceof ICPPClassType) {
return findImplicitlyCalledConstructor((ICPPClassType) type,
expr.getInitializer(), expr.getTypeId());
}
return null;
}
private static ICPPConstructor findImplicitlyCalledConstructor(ICPPClassType type, IASTInitializer initializer,
IASTNode typeId) {
try {
if (initializer instanceof IASTEqualsInitializer) { if (initializer instanceof IASTEqualsInitializer) {
// Copy initialization. // Copy initialization.
IASTEqualsInitializer eqInit= (IASTEqualsInitializer) initializer; IASTEqualsInitializer eqInit= (IASTEqualsInitializer) initializer;
ICPPASTInitializerClause initClause = (ICPPASTInitializerClause) eqInit.getInitializerClause(); ICPPASTInitializerClause initClause = (ICPPASTInitializerClause) eqInit.getInitializerClause();
final ICPPEvaluation evaluation = initClause.getEvaluation(); final ICPPEvaluation evaluation = initClause.getEvaluation();
IType sourceType= evaluation.getTypeOrFunctionSet(name); IType sourceType= evaluation.getTypeOrFunctionSet(typeId);
ValueCategory isLValue= evaluation.getValueCategory(name); ValueCategory isLValue= evaluation.getValueCategory(typeId);
if (sourceType != null) { if (sourceType != null) {
Cost c; Cost c;
if (calculateInheritanceDepth(sourceType, classType, name) >= 0) { if (calculateInheritanceDepth(sourceType, type, typeId) >= 0) {
c = Conversions.copyInitializationOfClass(isLValue, sourceType, classType, false, name); c = Conversions.copyInitializationOfClass(isLValue, sourceType, type, false, typeId);
} else { } else {
c = Conversions.checkImplicitConversionSequence(type, sourceType, isLValue, UDCMode.ALLOWED, Context.ORDINARY, name); c = Conversions.checkImplicitConversionSequence(type, sourceType, isLValue, UDCMode.ALLOWED, Context.ORDINARY, typeId);
} }
if (c.converts()) { if (c.converts()) {
ICPPFunction f = c.getUserDefinedConversion(); ICPPFunction f = c.getUserDefinedConversion();
@ -3136,7 +3144,7 @@ public class CPPSemantics {
// List initialization. // List initialization.
ICPPEvaluation eval= ((ICPPASTInitializerList) initializer).getEvaluation(); ICPPEvaluation eval= ((ICPPASTInitializerList) initializer).getEvaluation();
if (eval instanceof EvalInitList) { if (eval instanceof EvalInitList) {
Cost c= Conversions.listInitializationSequence((EvalInitList) eval, type, UDCMode.ALLOWED, true, name); Cost c= Conversions.listInitializationSequence((EvalInitList) eval, type, UDCMode.ALLOWED, true, typeId);
if (c.converts()) { if (c.converts()) {
ICPPFunction f = c.getUserDefinedConversion(); ICPPFunction f = c.getUserDefinedConversion();
if (f instanceof ICPPConstructor) if (f instanceof ICPPConstructor)
@ -3145,35 +3153,22 @@ public class CPPSemantics {
} }
} else if (initializer instanceof ICPPASTConstructorInitializer) { } else if (initializer instanceof ICPPASTConstructorInitializer) {
// Direct initialization. // Direct initialization.
return findImplicitlyCalledConstructor(classType, return findImplicitlyCalledConstructor(type,
(ICPPASTConstructorInitializer) initializer, name); (ICPPASTConstructorInitializer) initializer, typeId);
} else if (initializer == null) { } else if (initializer == null) {
// Default initialization. // Default initialization.
ICPPConstructor[] ctors = ClassTypeHelper.getConstructors(classType, name); ICPPConstructor[] ctors = ClassTypeHelper.getConstructors(type, typeId);
for (ICPPConstructor ctor : ctors) { for (ICPPConstructor ctor : ctors) {
if (ctor.getRequiredArgumentCount() == 0) if (ctor.getRequiredArgumentCount() == 0)
return ctor; return ctor;
} }
return null; return null;
} }
} catch (DOMException e) { } catch (DOMException e) {
} }
return null; return null;
} }
public static ICPPConstructor findImplicitlyCalledConstructor(ICPPASTNewExpression expr) {
IType type = getNestedType(expr.getExpressionType(), TDEF | REF | CVTYPE);
if (!(type instanceof IPointerType))
return null;
type = ((IPointerType) type).getType();
IASTInitializer initializer = expr.getInitializer();
if (type instanceof ICPPClassType && initializer instanceof ICPPASTConstructorInitializer) {
return findImplicitlyCalledConstructor((ICPPClassType) type,
(ICPPASTConstructorInitializer) initializer, expr.getTypeId());
}
return null;
}
private static ICPPConstructor findImplicitlyCalledConstructor(ICPPClassType classType, private static ICPPConstructor findImplicitlyCalledConstructor(ICPPClassType classType,
ICPPASTConstructorInitializer initializer, IASTNode typeId) { ICPPASTConstructorInitializer initializer, IASTNode typeId) {
final IASTInitializerClause[] arguments = initializer.getArguments(); final IASTInitializerClause[] arguments = initializer.getArguments();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others. * Copyright (c) 2005, 2013 IBM Corporation 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
@ -81,6 +81,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
@ -161,9 +162,23 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions.UDCMod
* type instantiation. * type instantiation.
*/ */
public class CPPTemplates { public class CPPTemplates {
// The three constants below are used as special return values for the various overloads
// of CPPTemplates.determinePackSize() and for ICPPEvaluation.determinePackSize(), which
// search a type, template argument, or value for a usage of a template parameter pack
// and return the number of arguments bound to that parameter pack in an
// ICPPTemplateParameterMap.
// Used to indicate that the parameter pack is not bound to any arguments in the
// template parameter map. Computation of the pack size needs to be deferred until
// arguments for it become available.
static final int PACK_SIZE_DEFER = -1; static final int PACK_SIZE_DEFER = -1;
// Used to indicate that two different packs with different sizes were found.
static final int PACK_SIZE_FAIL = -2; static final int PACK_SIZE_FAIL = -2;
// Used to indicate that no template parameter packs were found.
static final int PACK_SIZE_NOT_FOUND = Integer.MAX_VALUE; static final int PACK_SIZE_NOT_FOUND = Integer.MAX_VALUE;
static enum TypeSelection { PARAMETERS, RETURN_TYPE, PARAMETERS_AND_RETURN_TYPE } static enum TypeSelection { PARAMETERS, RETURN_TYPE, PARAMETERS_AND_RETURN_TYPE }
/** /**
@ -1958,13 +1973,34 @@ public class CPPTemplates {
return arg; return arg;
} }
private static ICPPFunctionType getFunctionTypeIgnoringParametersWithDefaults(ICPPFunction function) {
ICPPParameter[] parameters = function.getParameters();
IType[] parameterTypes = new IType[parameters.length];
int i;
for (i = 0; i < parameters.length; ++i) {
ICPPParameter parameter = parameters[i];
if (!parameter.hasDefaultValue()) {
parameterTypes[i] = parameter.getType();
} else {
break;
}
}
ICPPFunctionType originalType = function.getType();
if (i == parameters.length) // no parameters with default arguments
return originalType;
return new CPPFunctionType(originalType.getReturnType(), ArrayUtil.trim(parameterTypes),
originalType.isConst(), originalType.isVolatile(), originalType.takesVarArgs());
}
private static int compareSpecialization(ICPPFunctionTemplate f1, ICPPFunctionTemplate f2, TypeSelection mode, IASTNode point) throws DOMException { private static int compareSpecialization(ICPPFunctionTemplate f1, ICPPFunctionTemplate f2, TypeSelection mode, IASTNode point) throws DOMException {
ICPPFunction transF1 = transferFunctionTemplate(f1, point); ICPPFunction transF1 = transferFunctionTemplate(f1, point);
if (transF1 == null) if (transF1 == null)
return -1; return -1;
final ICPPFunctionType ft2 = f2.getType(); final ICPPFunctionType ft2 = f2.getType();
final ICPPFunctionType transFt1 = transF1.getType(); // Ignore parameters with default arguments in the transformed function template
// as per [temp.func.order] p5.
final ICPPFunctionType transFt1 = getFunctionTypeIgnoringParametersWithDefaults(transF1);
IType[] pars; IType[] pars;
IType[] args; IType[] args;
switch(mode) { switch(mode) {
@ -2118,8 +2154,6 @@ public class CPPTemplates {
final ICPPTemplateParameter[] tpars2 = f2.getTemplateParameters(); final ICPPTemplateParameter[] tpars2 = f2.getTemplateParameters();
final ICPPTemplateArgument[] targs1 = f1.getTemplateArguments(); final ICPPTemplateArgument[] targs1 = f1.getTemplateArguments();
final ICPPTemplateArgument[] targs2 = f2.getTemplateArguments(); final ICPPTemplateArgument[] targs2 = f2.getTemplateArguments();
if (targs1.length != targs2.length)
return false;
// Transfer arguments of specialization 1 // Transfer arguments of specialization 1
final int tpars1Len = tpars1.length; final int tpars1Len = tpars1.length;
@ -2129,22 +2163,17 @@ public class CPPTemplates {
final ICPPTemplateParameter param = tpars1[i]; final ICPPTemplateParameter param = tpars1[i];
final ICPPTemplateArgument arg = uniqueArg(param); final ICPPTemplateArgument arg = uniqueArg(param);
args[i]= arg; args[i]= arg;
transferMap.put(param, arg); if (param.isParameterPack()) {
transferMap.put(param, new ICPPTemplateArgument[] { arg });
} else {
transferMap.put(param, arg);
}
} }
final ICPPTemplateArgument[] transferredArgs1 = instantiateArguments(targs1, transferMap, -1, null, point, false); final ICPPTemplateArgument[] transferredArgs1 = instantiateArguments(targs1, transferMap, -1, null, point, false);
// Deduce arguments for specialization 2 // Deduce arguments for specialization 2
final CPPTemplateParameterMap deductionMap= new CPPTemplateParameterMap(2); final CPPTemplateParameterMap deductionMap= new CPPTemplateParameterMap(2);
if (!TemplateArgumentDeduction.fromTemplateArguments(tpars2, targs2, transferredArgs1, deductionMap, point)) return TemplateArgumentDeduction.fromTemplateArguments(tpars2, targs2, transferredArgs1, deductionMap, point);
return false;
// Compare
for (int i = 0; i < targs2.length; i++) {
ICPPTemplateArgument transferredArg2= instantiateArgument(targs2[i], deductionMap, -1, null, point);
if (!transferredArg2.isSameValue(transferredArgs1[i]))
return false;
}
return true;
} }
static boolean isValidType(IType t) { static boolean isValidType(IType t) {
@ -2226,6 +2255,9 @@ public class CPPTemplates {
pType= instantiateType(pType, map, -1, null, point); pType= instantiateType(pType, map, -1, null, point);
} }
if (argType instanceof ICPPParameterPackType) {
argType = ((ICPPParameterPackType) argType).getType();
}
if (argType instanceof ICPPUnknownType) { if (argType instanceof ICPPUnknownType) {
return new CPPTemplateNonTypeArgument(arg.getNonTypeValue(), pType); return new CPPTemplateNonTypeArgument(arg.getNonTypeValue(), pType);
} }

View file

@ -360,8 +360,13 @@ public class EvalID extends CPPEvaluation {
@Override @Override
public int determinePackSize(ICPPTemplateParameterMap tpMap) { public int determinePackSize(ICPPTemplateParameterMap tpMap) {
int r = fFieldOwner != null ? fFieldOwner.determinePackSize(tpMap) : CPPTemplates.PACK_SIZE_NOT_FOUND; int r = fFieldOwner != null ? fFieldOwner.determinePackSize(tpMap) : CPPTemplates.PACK_SIZE_NOT_FOUND;
for (ICPPTemplateArgument arg : fTemplateArgs) { if (fNameOwner instanceof ICPPUnknownBinding) {
r = CPPTemplates.combinePackSize(r, CPPTemplates.determinePackSize(arg, tpMap)); r = CPPTemplates.combinePackSize(r, CPPTemplates.determinePackSize((ICPPUnknownBinding) fNameOwner, tpMap));
}
if (fTemplateArgs != null) {
for (ICPPTemplateArgument arg : fTemplateArgs) {
r = CPPTemplates.combinePackSize(r, CPPTemplates.determinePackSize(arg, tpMap));
}
} }
return r; return r;
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2012 IBM Corporation and others. * Copyright (c) 2004, 2013 IBM Corporation 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
@ -11,6 +11,7 @@
* Bryan Wilkinson (QNX) * Bryan Wilkinson (QNX)
* Andrew Ferguson (Symbian) * Andrew Ferguson (Symbian)
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
@ -49,7 +50,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -663,46 +663,7 @@ public class SemanticUtil {
return -1; return -1;
} }
public static boolean containsUniqueTypeForParameterPack(IType type) { public static boolean isUniqueTypeForParameterPack(IType type) {
if (type instanceof ICPPFunctionType) {
final ICPPFunctionType ft = (ICPPFunctionType) type;
if (containsUniqueTypeForParameterPack(ft.getReturnType()))
return true;
for (IType pt : ft.getParameterTypes()) {
if (containsUniqueTypeForParameterPack(pt))
return true;
}
return false;
}
if (type instanceof ICPPPointerToMemberType) {
if (containsUniqueTypeForParameterPack(((ICPPPointerToMemberType) type).getMemberOfClass()))
return true;
}
if (type instanceof IBinding) {
IBinding owner = ((IBinding) type).getOwner();
if (owner instanceof IType) {
if (containsUniqueTypeForParameterPack((IType) owner))
return true;
}
}
if (type instanceof ICPPTemplateInstance) {
ICPPTemplateArgument[] args = ((ICPPTemplateInstance) type).getTemplateArguments();
for (ICPPTemplateArgument arg : args) {
if (containsUniqueTypeForParameterPack(arg.getTypeValue()))
return true;
}
}
if (type instanceof ITypeContainer) {
final ITypeContainer tc = (ITypeContainer) type;
final IType nestedType= tc.getType();
return containsUniqueTypeForParameterPack(nestedType);
}
if (type instanceof UniqueType) { if (type instanceof UniqueType) {
return ((UniqueType) type).isForParameterPack(); return ((UniqueType) type).isForParameterPack();
} }

View file

@ -0,0 +1,204 @@
/*******************************************************************************
* Copyright (c) 2012, 2013 Google, Inc 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.Value;
import org.eclipse.core.runtime.CoreException;
class SignatureBuilder implements ITypeMarshalBuffer {
private static final byte NULL_TYPE= 0;
private static final byte UNSTORABLE_TYPE= (byte) -1;
private final StringBuilder fBuffer;
/**
* Constructor for input buffer.
*/
public SignatureBuilder() {
fBuffer= new StringBuilder();
}
@Override
public String toString() {
return fBuffer.toString();
}
public char[] getSignature() {
return CharArrayUtils.extractChars(fBuffer);
}
@Override
public void marshalBinding(IBinding binding) throws CoreException {
if (binding instanceof ISerializableType) {
((ISerializableType) binding).marshal(this);
} else if (binding == null) {
putByte(NULL_TYPE);
} else {
appendSeparator();
if (binding instanceof ICPPBinding) {
if (binding instanceof ICPPTemplateParameter) {
ICPPTemplateParameter param = (ICPPTemplateParameter) binding;
fBuffer.append(param.isParameterPack() ? '*' : '#');
fBuffer.append(param.getParameterID());
} else {
fBuffer.append(ASTTypeUtil.getQualifiedName((ICPPBinding) binding));
}
} else {
fBuffer.append(binding.getNameCharArray());
}
}
}
@Override
public void marshalType(IType type) throws CoreException {
if (type instanceof ISerializableType) {
((ISerializableType) type).marshal(this);
} else if (type == null) {
putByte(NULL_TYPE);
} else if (type instanceof IBinding) {
marshalBinding((IBinding) type);
} else {
assert false : "Cannot serialize " + ASTTypeUtil.getType(type) + " (" + type.getClass().getName() + ")"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
putByte(UNSTORABLE_TYPE);
}
}
@Override
public void marshalEvaluation(ISerializableEvaluation eval, boolean includeValues) throws CoreException {
if (eval == null) {
putByte(NULL_TYPE);
} else {
eval.marshal(this, includeValues);
}
}
@Override
public void marshalValue(IValue value) throws CoreException {
if (value instanceof Value) {
((Value) value).marshall(this);
} else {
putByte(NULL_TYPE);
}
}
@Override
public void marshalTemplateArgument(ICPPTemplateArgument arg) throws CoreException {
if (arg.isNonTypeValue()) {
putByte(VALUE);
arg.getNonTypeEvaluation().marshal(this, true);
} else {
marshalType(arg.getTypeValue());
}
}
@Override
public void putByte(byte value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putFixedInt(int value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putInt(int value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putLong(long value) {
appendSeparator();
fBuffer.append(value);
}
@Override
public void putCharArray(char[] chars) {
appendSeparator();
for (char c : chars) {
fBuffer.append(c);
}
}
private void appendSeparator() {
if (fBuffer.length() != 0)
fBuffer.append(' ');
}
@Override
public IBinding unmarshalBinding() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public IType unmarshalType() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public ISerializableEvaluation unmarshalEvaluation() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public IValue unmarshalValue() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public ICPPTemplateArgument unmarshalTemplateArgument() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public int getByte() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public CoreException unmarshallingError() {
throw new UnsupportedOperationException();
}
@Override
public int getFixedInt() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public int getInt() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public long getLong() throws CoreException {
throw new UnsupportedOperationException();
}
@Override
public char[] getCharArray() throws CoreException {
throw new UnsupportedOperationException();
}
}

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009, 2012 Wind River Systems, Inc. and others. * Copyright (c) 2009, 2013 Wind River Systems, Inc. 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
@ -8,6 +8,7 @@
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
@ -36,7 +37,6 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IQualifierType; import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
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.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
@ -431,7 +431,7 @@ public class TemplateArgumentDeduction {
deduct.incPackOffset(); deduct.incPackOffset();
} else { } else {
if (j >= fnParCount) if (j >= fnParCount)
return result; return -1;
par= fnPars[j]; par= fnPars[j];
if (par instanceof ICPPParameterPackType) { if (par instanceof ICPPParameterPackType) {
@ -606,15 +606,36 @@ public class TemplateArgumentDeduction {
final ICPPTemplateArgument[] p, final ICPPTemplateArgument[] a, CPPTemplateParameterMap map, final ICPPTemplateArgument[] p, final ICPPTemplateArgument[] a, CPPTemplateParameterMap map,
IASTNode point) throws DOMException { IASTNode point) throws DOMException {
TemplateArgumentDeduction deduct= new TemplateArgumentDeduction(pars, null, map, 0); TemplateArgumentDeduction deduct= new TemplateArgumentDeduction(pars, null, map, 0);
final int len= a.length; if (p == null) {
if (p == null || p.length != len) {
return false; return false;
} }
for (int j= 0; j < len; j++) { boolean containsPackExpansion= false;
if (!deduct.fromTemplateArgument(p[j], a[j], point)) { for (int j= 0; j < p.length; j++) {
return false; if (p[j].isPackExpansion()) {
deduct = new TemplateArgumentDeduction(deduct, a.length - j);
containsPackExpansion= true;
if (j != p.length - 1) {
return false; // A pack expansion must be the last argument to the specialization.
}
ICPPTemplateArgument pattern = p[j].getExpansionPattern();
for (int i= j; i < a.length; i++) {
if (!deduct.fromTemplateArgument(pattern, a[i], point)) {
return false;
}
deduct.incPackOffset();
}
break;
} else {
if (j >= a.length) {
return false; // Not enough arguments.
}
if (!deduct.fromTemplateArgument(p[j], a[j], point)) {
return false;
}
} }
} }
if (!containsPackExpansion && p.length < a.length)
return false; // Too many arguments.
return verifyDeduction(pars, map, false, point); return verifyDeduction(pars, map, false, point);
} }
@ -636,16 +657,8 @@ public class TemplateArgumentDeduction {
deducedArg= tpar.getDefaultValue(); deducedArg= tpar.getDefaultValue();
if (deducedArg != null) { if (deducedArg != null) {
deducedArg= CPPTemplates.instantiateArgument(deducedArg, tpMap, -1, null, point); deducedArg= CPPTemplates.instantiateArgument(deducedArg, tpMap, -1, null, point);
if (deducedArg != null) { if (CPPTemplates.isValidArgument(deducedArg)) {
if (deducedArg instanceof CPPTemplateTypeArgument) { tpMap.put(tpar, deducedArg);
CPPTemplateTypeArgument deducedTypeArg = (CPPTemplateTypeArgument) deducedArg;
if (!(deducedTypeArg.getTypeValue() instanceof ISemanticProblem)) {
tpMap.put(tpar, deducedArg);
}
} else {
// TODO: Check for problems in non-type or template template parameters?
tpMap.put(tpar, deducedArg);
}
} }
} }
} }
@ -957,7 +970,7 @@ public class TemplateArgumentDeduction {
return false; return false;
return fDeducedArgs.putPackElement(parID, fPackOffset, arg, fPackSize); return fDeducedArgs.putPackElement(parID, fPackOffset, arg, fPackSize);
} }
if (SemanticUtil.containsUniqueTypeForParameterPack(arg.getTypeValue())) if (SemanticUtil.isUniqueTypeForParameterPack(arg.getTypeValue()))
return false; return false;
fDeducedArgs.put(parID, arg); fDeducedArgs.put(parID, arg);
return true; return true;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2012 Wind River Systems, Inc. and others. * Copyright (c) 2012, 2013 Wind River Systems, Inc. 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
@ -7,9 +7,11 @@
* *
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
@ -48,6 +50,17 @@ public class TypeOfDependentExpression implements ICPPUnknownType, ISerializable
} }
} }
public char[] getSignature() {
SignatureBuilder buf = new SignatureBuilder();
try {
marshal(buf);
} catch (CoreException e) {
CCorePlugin.log(e);
return new char[] { '?' };
}
return buf.getSignature();
}
@Override @Override
public void marshal(ITypeMarshalBuffer buffer) throws CoreException { public void marshal(ITypeMarshalBuffer buffer) throws CoreException {
buffer.putByte(ITypeMarshalBuffer.DEPENDENT_EXPRESSION_TYPE); buffer.putByte(ITypeMarshalBuffer.DEPENDENT_EXPRESSION_TYPE);

View file

@ -130,7 +130,7 @@ abstract class LocationCtx implements ILocationCtx {
* Returns the sequence of file locations spanning the given range. * Returns the sequence of file locations spanning the given range.
* Assumes that the range starts within this context. * Assumes that the range starts within this context.
*/ */
public abstract boolean collectLocations(int sequenceNumber, int length, ArrayList<IASTNodeLocation> sofar); public abstract void collectLocations(int sequenceNumber, int length, ArrayList<IASTNodeLocation> sofar);
/** /**
* Support for the dependency tree, add inclusion statements found in this context. * Support for the dependency tree, add inclusion statements found in this context.

View file

@ -32,7 +32,7 @@ class LocationCtxContainer extends LocationCtx {
private int fChildSequenceLength; private int fChildSequenceLength;
private ArrayList<LocationCtx> fChildren; private ArrayList<LocationCtx> fChildren;
private AbstractCharArray fSource; private final AbstractCharArray fSource;
private int[] fLineOffsets; private int[] fLineOffsets;
public LocationCtxContainer(LocationCtxContainer parent, AbstractCharArray source, public LocationCtxContainer(LocationCtxContainer parent, AbstractCharArray source,
@ -138,47 +138,55 @@ class LocationCtxContainer extends LocationCtx {
} }
@Override @Override
public boolean collectLocations(int sequenceNumber, final int length, ArrayList<IASTNodeLocation> locations) { public void collectLocations(int sequenceNumber, final int length, ArrayList<IASTNodeLocation> locations) {
if (length < 1)
return;
final int endSequenceNumber= sequenceNumber + length; final int endSequenceNumber= sequenceNumber + length;
if (fChildren != null) { if (fChildren != null) {
int childIdx= Math.max(0, findChildIdxLessOrEqualThan(sequenceNumber, false)); int childIdx= Math.max(0, findChildIdxLessOrEqualThan(sequenceNumber, false));
for (; childIdx < fChildren.size(); childIdx++) { for (; childIdx < fChildren.size(); childIdx++) {
final LocationCtx child= fChildren.get(childIdx); final LocationCtx child= fChildren.get(childIdx);
// create the location between start and the child // Create the location between start and the child
if (sequenceNumber < child.fSequenceNumber) { if (sequenceNumber < child.fSequenceNumber) {
// compute offset backwards from the child's offset // Compute offset backwards from the child's offset in this location
final int offset= child.fEndOffsetInParent - (child.fSequenceNumber - sequenceNumber); final int offset= child.fEndOffsetInParent - (child.fSequenceNumber - sequenceNumber);
// it the child is not affected, we are done.
// Requested range ends before the child.
if (endSequenceNumber <= child.fSequenceNumber) { if (endSequenceNumber <= child.fSequenceNumber) {
addFileLocation(offset, endSequenceNumber - sequenceNumber, locations); addFileLocation(offset, endSequenceNumber - sequenceNumber, locations);
return true; return;
} }
if (offset < child.fOffsetInParent)
final int gapLen = child.fOffsetInParent - offset;
if (gapLen > 0)
addFileLocation(offset, child.fOffsetInParent - offset, locations); addFileLocation(offset, child.fOffsetInParent - offset, locations);
sequenceNumber= child.fSequenceNumber; sequenceNumber= child.fSequenceNumber;
assert sequenceNumber < endSequenceNumber;
} }
// let the child create locations // Let the child create locations
final int childEndSequenceNumber= child.fSequenceNumber + child.getSequenceLength(); final int childEndSequenceNumber= child.fSequenceNumber + child.getSequenceLength();
if (sequenceNumber < childEndSequenceNumber) { if (sequenceNumber < childEndSequenceNumber
if (child.collectLocations(sequenceNumber, endSequenceNumber - sequenceNumber, locations)) { || (sequenceNumber == childEndSequenceNumber && !locations.isEmpty())) {
return true; child.collectLocations(sequenceNumber, endSequenceNumber - sequenceNumber, locations);
}
sequenceNumber= childEndSequenceNumber; sequenceNumber= childEndSequenceNumber;
if (sequenceNumber >= endSequenceNumber)
return;
} }
} }
} }
// create the location after the last child. // Create the location after the last child.
final int myEndNumber = fSequenceNumber + getSequenceLength(); final int myEndNumber = fSequenceNumber + getSequenceLength();
final int offset= fSource.getLength() - (myEndNumber - sequenceNumber); final int offset= fSource.getLength() - (myEndNumber - sequenceNumber);
if (endSequenceNumber <= myEndNumber) { if (endSequenceNumber <= myEndNumber) {
addFileLocation(offset, endSequenceNumber - sequenceNumber, locations); addFileLocation(offset, endSequenceNumber - sequenceNumber, locations);
return true; } else {
addFileLocation(offset, fSource.getLength() - offset, locations);
} }
addFileLocation(offset, fSource.getLength() - offset, locations);
return false;
} }
private ArrayList<IASTNodeLocation> addFileLocation(int offset, int length, ArrayList<IASTNodeLocation> sofar) { private ArrayList<IASTNodeLocation> addFileLocation(int offset, int length, ArrayList<IASTNodeLocation> sofar) {

View file

@ -25,7 +25,7 @@ class LocationCtxMacroExpansion extends LocationCtx {
private final LocationMap fLocationMap; private final LocationMap fLocationMap;
private final int fLength; private final int fLength;
private final ImageLocationInfo[] fLocationInfos; private final ImageLocationInfo[] fLocationInfos;
private ASTMacroReferenceName fExpansionName; private final ASTMacroReferenceName fExpansionName;
public LocationCtxMacroExpansion(LocationMap map, LocationCtxContainer parent, int parentOffset, int parentEndOffset, public LocationCtxMacroExpansion(LocationMap map, LocationCtxContainer parent, int parentOffset, int parentEndOffset,
int sequenceNumber, int length, ImageLocationInfo[] imageLocations, ASTMacroReferenceName expansionName) { int sequenceNumber, int length, ImageLocationInfo[] imageLocations, ASTMacroReferenceName expansionName) {
@ -45,17 +45,15 @@ class LocationCtxMacroExpansion extends LocationCtx {
} }
@Override @Override
public boolean collectLocations(int start, int length, ArrayList<IASTNodeLocation> locations) { public void collectLocations(int start, int length, ArrayList<IASTNodeLocation> locations) {
final int offset= start - fSequenceNumber; final int offset= start - fSequenceNumber;
assert offset >= 0 && length >= 0; assert offset >= 0 && length >= 0;
if (offset + length <= fLength) { if (offset + length <= fLength) {
locations.add(new ASTMacroExpansionLocation(this, offset, length)); locations.add(new ASTMacroExpansionLocation(this, offset, length));
return true; } else {
locations.add(new ASTMacroExpansionLocation(this, offset, fLength-offset));
} }
locations.add(new ASTMacroExpansionLocation(this, offset, fLength-offset));
return false;
} }
public ASTMacroExpansion getExpansion() { public ASTMacroExpansion getExpansion() {

View file

@ -268,7 +268,7 @@
<pattern description-expr="make: $3" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="(.*):(\d*): (\*\*\* .*)" severity="Error"/> <pattern description-expr="make: $3" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="(.*):(\d*): (\*\*\* .*)" severity="Error"/>
<pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*: \*\*\* .*" severity="Error"/> <pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*: \*\*\* .*" severity="Error"/>
<pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*: Target (.*) not remade because of errors." severity="Error"/> <pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*: Target (.*) not remade because of errors." severity="Error"/>
<pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*command not found.*" severity="Error"/> <pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*[Cc]ommand not found.*" severity="Error"/>
<pattern description-expr="$1" eat-processed-line="true" file-expr="" line-expr="" regex="Error:\s*(.*)" severity="Error"/> <pattern description-expr="$1" eat-processed-line="true" file-expr="" line-expr="" regex="Error:\s*(.*)" severity="Error"/>
<pattern description-expr="make: $3" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="(.*[Mm]akefile):(\d*): warning: (.*)" severity="Warning"/> <pattern description-expr="make: $3" eat-processed-line="true" file-expr="$1" line-expr="$2" regex="(.*[Mm]akefile):(\d*): warning: (.*)" severity="Warning"/>
<pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*\[.*\] Error [-]{0,1}\d*.*" severity="Warning"/> <pattern description-expr="$0" eat-processed-line="true" file-expr="" line-expr="" regex=".*make.*\[.*\] Error [-]{0,1}\d*.*" severity="Warning"/>

View file

@ -20,7 +20,7 @@ import junit.framework.TestSuite;
import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.IRegion;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.parser.tests.ast2.AST2BaseTest; import org.eclipse.cdt.core.parser.tests.ast2.AST2TestBase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.ui.testplugin.CTestPlugin; import org.eclipse.cdt.ui.testplugin.CTestPlugin;
@ -31,7 +31,7 @@ import org.eclipse.cdt.internal.ui.search.LinkedNamesFinder;
/** /**
* Tests for LinkedNamesFinder class. * Tests for LinkedNamesFinder class.
*/ */
public class LinkedNamesFinderTest extends AST2BaseTest { public class LinkedNamesFinderTest extends AST2TestBase {
private static class RegionComparator implements Comparator<IRegion> { private static class RegionComparator implements Comparator<IRegion> {
@Override @Override
public int compare(IRegion r1, IRegion r2) { public int compare(IRegion r1, IRegion r2) {

View file

@ -1,11 +1,11 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2011 IBM Corporation and others. * Copyright (c) 2000, 2013 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems) - Adapted for CDT * Anton Leherbauer (Wind River Systems) - Adapted for CDT
*******************************************************************************/ *******************************************************************************/
@ -20,13 +20,12 @@ import org.eclipse.cdt.internal.ui.editor.SemanticHighlightings;
/** /**
* Semantic highlighting tests. * Semantic highlighting tests.
* *
* <p>Derived from JDT.<p> * <p>Derived from JDT.<p>
* *
* @since 4.0 * @since 4.0
*/ */
public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest { public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
private static final boolean PRINT_POSITIONS= false; private static final boolean PRINT_POSITIONS= false;
private static final Class<?> THIS= SemanticHighlightingTest.class; private static final Class<?> THIS= SemanticHighlightingTest.class;
@ -101,7 +100,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(108, 4, 26), createPosition(108, 4, 26),
createPosition(112, 4, 25), createPosition(112, 4, 25),
createPosition(117, 4, 32), createPosition(117, 4, 32),
}; };
if (PRINT_POSITIONS) System.out.println(toString(actual)); if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual); assertEqualPositions(expected, actual);
} }
@ -121,10 +120,9 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(108, 4, 26), createPosition(108, 4, 26),
createPosition(112, 4, 25), createPosition(112, 4, 25),
createPosition(117, 4, 32), createPosition(117, 4, 32),
createPosition(118, 23, 9),
createPosition(122, 4, 15), createPosition(122, 4, 15),
createPosition(130, 13, 9), createPosition(130, 13, 9),
}; };
Position[] actual= getSemanticHighlightingPositions(); Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual)); if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual); assertEqualPositions(expected, actual);
@ -134,7 +132,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.STATIC_METHOD_INVOCATION); setUpSemanticHighlighting(SemanticHighlightings.STATIC_METHOD_INVOCATION);
Position[] expected= new Position[] { Position[] expected= new Position[] {
createPosition(122, 4, 15), createPosition(122, 4, 15),
}; };
Position[] actual= getSemanticHighlightingPositions(); Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual)); if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual); assertEqualPositions(expected, actual);
@ -256,6 +254,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(112, 4, 14), createPosition(112, 4, 14),
createPosition(117, 4, 14), createPosition(117, 4, 14),
createPosition(118, 4, 9), createPosition(118, 4, 9),
createPosition(118, 23, 9),
createPosition(120, 4, 8), createPosition(120, 4, 8),
createPosition(129, 4, 8), createPosition(129, 4, 8),
createPosition(147, 42, 7), createPosition(147, 42, 7),
@ -297,7 +296,6 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
assertEqualPositions(expected, actual); assertEqualPositions(expected, actual);
} }
public void testGlobalVariableHighlighting() throws Exception { public void testGlobalVariableHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.GLOBAL_VARIABLE); setUpSemanticHighlighting(SemanticHighlightings.GLOBAL_VARIABLE);
Position[] actual= getSemanticHighlightingPositions(); Position[] actual= getSemanticHighlightingPositions();
@ -421,5 +419,4 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
if (PRINT_POSITIONS) System.out.println(toString(actual)); if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual); assertEqualPositions(expected, actual);
} }
} }

View file

@ -629,9 +629,11 @@ LanguageSettingsProviderAssociationExtensionPoint=Language Settings Provider UI
overrideAnnotation.label = C/C++ Override indicators overrideAnnotation.label = C/C++ Override indicators
transfer.EditorAppearance.name = C/C++ Editor Appearance transfer.EditorAppearance.name = C/C++ Editor Appearance
transfer.EditorAppearance.description = Preference related to how the editor presents the edited code to the user (including colors, fonts, hovers, foldings, etc...) transfer.EditorAppearance.description = Preferences related to how the editor presents the edited code to the user (including colors, fonts, hovers, foldings, etc...)
transfer.EditorBehavior.name = C/C++ Editor Behavior transfer.EditorBehavior.name = C/C++ Editor Behavior
transfer.EditorBehavior.description = Preference related to how the editor process the edited code (typing, save action, etc...) transfer.EditorBehavior.description = Preferences related to how the editor deals with the edited code (typing, save action, etc...)
transfer.CodeStyle.name = C/C++ Code Style
transfer.CodeStyle.description = C/C++ > Code Style preferences
# Refresh Exclusion Contributors # Refresh Exclusion Contributors
RefreshExclusionContributor.name = Resources RefreshExclusionContributor.name = Resources

View file

@ -4499,6 +4499,7 @@
<extension <extension
point="org.eclipse.ui.preferenceTransfer"> point="org.eclipse.ui.preferenceTransfer">
<transfer <transfer
icon="icons/view16/c_pers.gif"
id="org.eclipse.cdt.ui.transfer.editor.appearance" id="org.eclipse.cdt.ui.transfer.editor.appearance"
name="%transfer.EditorAppearance.name"> name="%transfer.EditorAppearance.name">
<mapping scope="instance"> <mapping scope="instance">
@ -4557,6 +4558,7 @@
</description> </description>
</transfer> </transfer>
<transfer <transfer
icon="icons/view16/c_pers.gif"
id="org.eclipse.cdt.ui.transfer.editor.behavior" id="org.eclipse.cdt.ui.transfer.editor.behavior"
name="%transfer.EditorBehavior.name"> name="%transfer.EditorBehavior.name">
<mapping scope="instance"> <mapping scope="instance">
@ -4590,15 +4592,31 @@
<key name="stickyOccurrences"/> <key name="stickyOccurrences"/>
<key name="markOverloadedOperatorsOccurrences"/> <key name="markOverloadedOperatorsOccurrences"/>
<key name="scalability." match="prefix"/> <key name="scalability." match="prefix"/>
<key <key name="content_assist_proposals_timeout"/>
name="content_assist_proposals_timeout">
</key>
</entry> </entry>
</mapping> </mapping>
<description> <description>
%transfer.EditorBehavior.description %transfer.EditorBehavior.description
</description> </description>
</transfer> </transfer>
<transfer
icon="icons/view16/c_pers.gif"
id="org.eclipse.cdt.ui.transfer.code_style"
name="%transfer.CodeStyle.name">
<mapping scope="instance">
<entry node="org.eclipse.cdt.ui">
<key name="codetemplates." match="prefix"/>
<key name="nameStyle." match="prefix"/>
<key name="formatter_profile"/>
<key name="class_member_ascending_visibility_order"/>
<key name="function_output_parameters_before_input"/>
<key name="function_pass_output_parameters_by_pointer"/>
</entry>
</mapping>
<description>
%transfer.CodeStyle.description
</description>
</transfer>
</extension> </extension>
<extension <extension

View file

@ -207,7 +207,7 @@ public abstract class AbstractCModelOutlinePage extends Page
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_INCLUDES, isChecked()); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_INCLUDES, isChecked());
} }
public boolean isIncludesGroupingEnabled () { public boolean isIncludesGroupingEnabled() {
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES); return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES);
} }
} }
@ -240,7 +240,7 @@ public abstract class AbstractCModelOutlinePage extends Page
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MACROS, isChecked()); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MACROS, isChecked());
} }
public boolean isMacroGroupingEnabled () { public boolean isMacroGroupingEnabled() {
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_MACROS); return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_MACROS);
} }
} }
@ -374,8 +374,8 @@ public abstract class AbstractCModelOutlinePage extends Page
} else if (fInput != null) { } else if (fInput != null) {
try { try {
element= fInput.getElementAtOffset(offset); element= fInput.getElementAtOffset(offset);
} catch (CModelException exc) { } catch (CModelException e) {
CUIPlugin.log(exc); CUIPlugin.log(e);
} }
} }
if (element != null) { if (element != null) {
@ -526,7 +526,7 @@ public abstract class AbstractCModelOutlinePage extends Page
fTreeViewer.setInput(fInput); fTreeViewer.setInput(fInput);
PlatformUI.getWorkbench().getHelpSystem().setHelp(control, ICHelpContextIds.COUTLINE_VIEW); PlatformUI.getWorkbench().getHelpSystem().setHelp(control, ICHelpContextIds.COUTLINE_VIEW);
IHandlerService handlerService= (IHandlerService)site.getService(IHandlerService.class); IHandlerService handlerService= (IHandlerService) site.getService(IHandlerService.class);
handlerService.activateHandler(CollapseAllHandler.COMMAND_ID, new ActionHandler(fCollapseAllAction)); handlerService.activateHandler(CollapseAllHandler.COMMAND_ID, new ActionHandler(fCollapseAllAction));
} }
@ -761,7 +761,7 @@ public abstract class AbstractCModelOutlinePage extends Page
public void setInput(ITranslationUnit unit) { public void setInput(ITranslationUnit unit) {
fInput = unit; fInput = unit;
if (fTreeViewer != null) { if (fTreeViewer != null) {
fTreeViewer.setInput (fInput); fTreeViewer.setInput(fInput);
} }
} }

View file

@ -39,7 +39,6 @@ import org.eclipse.cdt.internal.corext.codemanipulation.StubUtility;
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener; import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo; import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.util.NameComposer; import org.eclipse.cdt.internal.ui.util.NameComposer;
import org.eclipse.cdt.internal.ui.viewsupport.ProjectTemplateStore;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter; import org.eclipse.cdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
@ -254,17 +253,6 @@ public class NameStyleBlock extends OptionsConfigurationBlock {
categoryTree.postSetSelection(new StructuredSelection(element)); categoryTree.postSetSelection(new StructuredSelection(element));
} }
@Override
public boolean hasProjectSpecificOptions(IProject project) {
if (super.hasProjectSpecificOptions(project))
return true;
if (project != null) {
return ProjectTemplateStore.hasProjectSpecificTempates(project);
}
return false;
}
@Override @Override
protected Control createContents(Composite parent) { protected Control createContents(Composite parent) {
pixelConverter = new PixelConverter(parent); pixelConverter = new PixelConverter(parent);
@ -416,11 +404,6 @@ public class NameStyleBlock extends OptionsConfigurationBlock {
updateConfigurationBlock(categoryTree.getSelectedElements()); updateConfigurationBlock(categoryTree.getSelectedElements());
} }
@Override
public boolean performOk() {
return super.performOk();
}
@Override @Override
protected void validateSettings(Key changedKey, String oldValue, String newValue) { protected void validateSettings(Key changedKey, String oldValue, String newValue) {
StatusInfo status = new StatusInfo(); StatusInfo status = new StatusInfo();
@ -648,7 +631,6 @@ public class NameStyleBlock extends OptionsConfigurationBlock {
private class NameStyleAdapter extends ViewerComparator private class NameStyleAdapter extends ViewerComparator
implements ITreeListAdapter<Category>, IDialogFieldListener { implements ITreeListAdapter<Category>, IDialogFieldListener {
@Override @Override
public void selectionChanged(TreeListDialogField<Category> field) { public void selectionChanged(TreeListDialogField<Category> field) {
updateConfigurationBlock(field.getSelectedElements()); updateConfigurationBlock(field.getSelectedElements());

View file

@ -32,7 +32,6 @@ import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels;
import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.CUIPlugin;
public class CUILabelProvider extends LabelProvider implements IColorProvider, IStyledLabelProvider { public class CUILabelProvider extends LabelProvider implements IColorProvider, IStyledLabelProvider {
protected CElementImageProvider fImageLabelProvider; protected CElementImageProvider fImageLabelProvider;
protected StorageLabelProvider fStorageLabelProvider; protected StorageLabelProvider fStorageLabelProvider;
@ -136,9 +135,6 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
return image; return image;
} }
/* (non-Javadoc)
* @see ILabelProvider#getImage
*/
@Override @Override
public Image getImage(Object element) { public Image getImage(Object element) {
Image result= fImageLabelProvider.getImageLabel(element, evaluateImageFlags(element)); Image result= fImageLabelProvider.getImageLabel(element, evaluateImageFlags(element));
@ -159,10 +155,6 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
return text; return text;
} }
/* (non-Javadoc)
* @see ILabelProvider#getText
*/
@Override @Override
public String getText(Object element) { public String getText(Object element) {
String result= CElementLabels.getTextLabel(element, evaluateTextFlags(element)); String result= CElementLabels.getTextLabel(element, evaluateTextFlags(element));
@ -186,10 +178,6 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
return string; return string;
} }
/* (non-Javadoc)
* @see IBaseLabelProvider#dispose
*/
@Override @Override
public void dispose() { public void dispose() {
if (fLabelDecorators != null) { if (fLabelDecorators != null) {
@ -203,9 +191,6 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
fImageLabelProvider.dispose(); fImageLabelProvider.dispose();
} }
/* (non-Javadoc)
* @see IBaseLabelProvider#addListener(ILabelProviderListener)
*/
@Override @Override
public void addListener(ILabelProviderListener listener) { public void addListener(ILabelProviderListener listener) {
if (fLabelDecorators != null) { if (fLabelDecorators != null) {
@ -217,17 +202,11 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
super.addListener(listener); super.addListener(listener);
} }
/* (non-Javadoc)
* @see IBaseLabelProvider#isLabelProperty(Object, String)
*/
@Override @Override
public boolean isLabelProperty(Object element, String property) { public boolean isLabelProperty(Object element, String property) {
return true; return true;
} }
/* (non-Javadoc)
* @see IBaseLabelProvider#removeListener(ILabelProviderListener)
*/
@Override @Override
public void removeListener(ILabelProviderListener listener) { public void removeListener(ILabelProviderListener listener) {
if (fLabelDecorators != null) { if (fLabelDecorators != null) {
@ -252,9 +231,6 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
return null; return null;
} }
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
*/
@Override @Override
public Color getForeground(Object element) { public Color getForeground(Object element) {
if (element instanceof ISourceReference) { if (element instanceof ISourceReference) {
@ -270,12 +246,8 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider, I
return fDefaultColor; return fDefaultColor;
} }
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
*/
@Override @Override
public Color getBackground(Object element) { public Color getBackground(Object element) {
return null; return null;
} }
} }

View file

@ -7,9 +7,13 @@
* *
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.viewsupport; package org.eclipse.cdt.internal.ui.viewsupport;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.resources.IResourceStatus;
@ -41,7 +45,7 @@ import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
/** /**
* LabelDecorator that decorates an element's image with error and warning overlays that * LabelDecorator that decorates an element's image with error and warning overlays that
* represent the severity of markers attached to the element's underlying resource. To see * represent the severity of markers attached to the element's underlying resource. To see
* a problem decoration for a marker, the marker needs to be a subtype of <code>IMarker.PROBLEM</code>. * a problem decoration for a marker, the marker needs to be a subtype of {@code IMarker.PROBLEM}.
* <p> * <p>
* Note: Only images for elements in Java projects are currently updated on marker changes. * Note: Only images for elements in Java projects are currently updated on marker changes.
* </p> * </p>
@ -49,23 +53,20 @@ import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
* @since 2.0 * @since 2.0
*/ */
public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabelDecorator { public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabelDecorator {
/** /**
* This is a special <code>LabelProviderChangedEvent</code> carring additional * This is a special {@code LabelProviderChangedEvent} carrying additional
* information whether the event orgins from a maker change. * information whether the event originates from a maker change.
* <p> * <p>
* <code>ProblemsLabelChangedEvent</code>s are only generated by <code> * {@code ProblemsLabelChangedEvent}s are only generated by {@code ProblemsLabelDecorator}s.
* ProblemsLabelDecorator</code>s.
* </p>
*/ */
public static class ProblemsLabelChangedEvent extends LabelProviderChangedEvent { public static class ProblemsLabelChangedEvent extends LabelProviderChangedEvent {
private boolean fMarkerChange; private boolean fMarkerChange;
/** /**
* Note: This constructor is for internal use only. Clients should not call this constructor. * Note: This constructor is for internal use only. Clients should not call this constructor.
*/ */
public ProblemsLabelChangedEvent(IBaseLabelProvider source, IResource[] changedResource, boolean isMarkerChange) { public ProblemsLabelChangedEvent(IBaseLabelProvider source, IResource[] changedResource,
boolean isMarkerChange) {
super(source, changedResource); super(source, changedResource);
fMarkerChange= isMarkerChange; fMarkerChange= isMarkerChange;
} }
@ -80,17 +81,45 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
public boolean isMarkerChange() { public boolean isMarkerChange() {
return fMarkerChange; return fMarkerChange;
} }
}
private static class MarkersCacheKey {
private IResource res;
private int depth;
public MarkersCacheKey(IResource res, int depth) {
this.res = res;
this.depth = depth;
}
@Override
public int hashCode() {
return res.hashCode() + 31 * depth;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MarkersCacheKey other = (MarkersCacheKey) obj;
return depth == other.depth && res.equals(other.res);
}
} }
private static final int ERRORTICK_WARNING= CElementImageDescriptor.WARNING; private static final int ERRORTICK_WARNING= CElementImageDescriptor.WARNING;
private static final int ERRORTICK_ERROR= CElementImageDescriptor.ERROR; private static final int ERRORTICK_ERROR= CElementImageDescriptor.ERROR;
private static final IMarker[] EMPTY_MARKER_ARRAY = {};
private ImageDescriptorRegistry fRegistry; private ImageDescriptorRegistry fRegistry;
private boolean fUseNewRegistry= false; private boolean fUseNewRegistry;
private IProblemChangedListener fProblemChangedListener; private IProblemChangedListener fProblemChangedListener;
private ListenerList fListeners; private ListenerList fListeners;
private Map<MarkersCacheKey, IMarker[]> fMarkersCache = new HashMap<MarkersCacheKey, IMarker[]>();
/** /**
* Creates a new <code>ProblemsLabelDecorator</code>. * Creates a new <code>ProblemsLabelDecorator</code>.
@ -119,7 +148,6 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
return fRegistry; return fRegistry;
} }
@Override @Override
public String decorateText(String text, Object element) { public String decorateText(String text, Object element) {
return text; return text;
@ -175,23 +203,29 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
return 0; return 0;
} }
private int getErrorTicksFromMarkers(IResource res, int depth, ISourceReference sourceElement) throws CoreException { private int getErrorTicksFromMarkers(IResource res, int depth, ISourceReference sourceElement)
throws CoreException {
if (res == null || !res.isAccessible()) { if (res == null || !res.isAccessible()) {
return 0; return 0;
} }
int info= 0; int info= 0;
IMarker[] markers= res.findMarkers(IMarker.PROBLEM, true, depth); MarkersCacheKey cacheKey = new MarkersCacheKey(res, depth);
if (markers != null) { IMarker[] markers = fMarkersCache .get(cacheKey);
for (int i= 0; i < markers.length && (info != ERRORTICK_ERROR); i++) { if (markers == null) {
IMarker curr= markers[i]; markers= res.findMarkers(IMarker.PROBLEM, true, depth);
if (sourceElement == null || isMarkerInRange(curr, sourceElement)) { if (markers == null)
int priority= curr.getAttribute(IMarker.SEVERITY, -1); markers = EMPTY_MARKER_ARRAY;
if (priority == IMarker.SEVERITY_WARNING) { fMarkersCache.put(cacheKey, markers);
info= ERRORTICK_WARNING; }
} else if (priority == IMarker.SEVERITY_ERROR) { for (int i= 0; i < markers.length && (info != ERRORTICK_ERROR); i++) {
info= ERRORTICK_ERROR; IMarker curr= markers[i];
} if (sourceElement == null || isMarkerInRange(curr, sourceElement)) {
int priority= curr.getAttribute(IMarker.SEVERITY, -1);
if (priority == IMarker.SEVERITY_WARNING) {
info= ERRORTICK_WARNING;
} else if (priority == IMarker.SEVERITY_ERROR) {
info= ERRORTICK_ERROR;
} }
} }
} }
@ -228,7 +262,7 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
protected boolean isInside(int offSet, int line, ISourceReference sourceElement) throws CoreException { protected boolean isInside(int offSet, int line, ISourceReference sourceElement) throws CoreException {
ISourceRange range= sourceElement.getSourceRange(); ISourceRange range= sourceElement.getSourceRange();
if (range != null) { if (range != null) {
if (offSet ==-1) { if (offSet == -1) {
return (line >= range.getStartLine() && line <= range.getEndLine()); return (line >= range.getStartLine() && line <= range.getEndLine());
} }
int rangeOffset= range.getStartPos(); int rangeOffset= range.getStartPos();
@ -282,6 +316,7 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
} }
protected void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) { protected void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) {
fMarkersCache.clear();
if (fListeners != null && !fListeners.isEmpty()) { if (fListeners != null && !fListeners.isEmpty()) {
LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange); LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange);
Object[] listeners= fListeners.getListeners(); Object[] listeners= fListeners.getListeners();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2011 QNX Software Systems and others. * Copyright (c) 2004, 2013 QNX Software Systems 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
@ -29,7 +29,6 @@ public final class NewClassWizardMessages extends NLS {
public static String NewClassCreationWizardPage_namespace_label; public static String NewClassCreationWizardPage_namespace_label;
public static String NewClassCreationWizardPage_namespace_button; public static String NewClassCreationWizardPage_namespace_button;
public static String NewClassCreationWizardPage_error_EnterNamespace; public static String NewClassCreationWizardPage_error_EnterNamespace;
public static String NewClassCreationWizardPage_error_EnclosingNamespaceNotExists;
public static String NewClassCreationWizardPage_error_NamespaceExistsDifferentCase; public static String NewClassCreationWizardPage_error_NamespaceExistsDifferentCase;
public static String NewClassCreationWizardPage_error_TypeMatchingNamespaceExists; public static String NewClassCreationWizardPage_error_TypeMatchingNamespaceExists;
public static String NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase; public static String NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase;

View file

@ -1,5 +1,5 @@
############################################################################### ###############################################################################
# Copyright (c) 2004, 2011 QNX Software Systems and others. # Copyright (c) 2004, 2013 QNX Software Systems 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
@ -34,11 +34,10 @@ NewClassCreationWizardPage_namespace_label=&Namespace:
NewClassCreationWizardPage_namespace_button=Bro&wse... NewClassCreationWizardPage_namespace_button=Bro&wse...
NewClassCreationWizardPage_error_EnterNamespace=Namespace is empty. NewClassCreationWizardPage_error_EnterNamespace=Namespace is empty.
NewClassCreationWizardPage_error_EnclosingNamespaceNotExists=Enclosing namespace does not exist.
NewClassCreationWizardPage_error_NamespaceExistsDifferentCase=Namespace with the same name exists in a different scope. NewClassCreationWizardPage_error_NamespaceExistsDifferentCase=Namespace with the same name exists in a different scope.
NewClassCreationWizardPage_error_TypeMatchingNamespaceExists=Another type with the same name as specified namespace exists. NewClassCreationWizardPage_error_TypeMatchingNamespaceExists=Another type with the same name as specified namespace exists.
NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase=Another type with the same name as specified namespace exists in a different scope. NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase=Another type with the same name as specified namespace exists in a different scope.
NewClassCreationWizardPage_warning_NamespaceNotExists=Namespace does not exist. A new namespace will be created. NewClassCreationWizardPage_warning_NamespaceNotExists=Namespace ''{0}'' does not exist. A new namespace will be created.
NewClassCreationWizardPage_error_InvalidNamespace=Namespace is not valid. {0}. NewClassCreationWizardPage_error_InvalidNamespace=Namespace is not valid. {0}.
NewClassCreationWizardPage_warning_NamespaceDiscouraged=Namespace is discouraged. {0}. NewClassCreationWizardPage_warning_NamespaceDiscouraged=Namespace is discouraged. {0}.

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2011 QNX Software Systems and others. * Copyright (c) 2004, 2013 QNX Software Systems 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
@ -1591,17 +1591,8 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
ICProject project = getCurrentProject(); ICProject project = getCurrentProject();
if (project != null) { if (project != null) {
/* search for parent name space first */ int searchResult = NewClassWizardUtil.searchForCppType(typeName, project, ICPPNamespace.class);
int searchResult; switch (searchResult) {
if (typeName.isQualified()) {
searchResult = NewClassWizardUtil.searchForCppType(typeName.getEnclosingTypeName(),project, ICPPNamespace.class);
if (searchResult != NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT) {
status.setError(NewClassWizardMessages.NewClassCreationWizardPage_error_EnclosingNamespaceNotExists);
return status;
}
}
searchResult = NewClassWizardUtil.searchForCppType(typeName, project, ICPPNamespace.class);
switch(searchResult) {
case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT: case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT:
status.setOK(); status.setOK();
return status; return status;
@ -1615,7 +1606,17 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
status.setWarning(NewClassWizardMessages.NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase); status.setWarning(NewClassWizardMessages.NewClassCreationWizardPage_error_TypeMatchingNamespaceExistsDifferentCase);
return status; return status;
case NewClassWizardUtil.SEARCH_MATCH_NOTFOUND: case NewClassWizardUtil.SEARCH_MATCH_NOTFOUND:
status.setWarning(NewClassWizardMessages.NewClassCreationWizardPage_warning_NamespaceNotExists); // Find the highest ancestor namespace that does not exist.
IQualifiedTypeName ns = typeName;
while (ns.isQualified()) {
IQualifiedTypeName ns1 = ns.getEnclosingTypeName();
if (NewClassWizardUtil.searchForCppType(ns1, project, ICPPNamespace.class) == NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT) {
break;
}
ns = ns1;
}
status.setWarning(NLS.bind(NewClassWizardMessages.NewClassCreationWizardPage_warning_NamespaceNotExists,
ns.getFullyQualifiedName()));
break; break;
} }
} }
@ -1638,7 +1639,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
StatusInfo status = new StatusInfo(); StatusInfo status = new StatusInfo();
String className = getClassName(); String className = getClassName();
// must not be empty // Must not be empty.
if (className == null || className.length() == 0) { if (className == null || className.length() == 0) {
status.setError(NewClassWizardMessages.NewClassCreationWizardPage_error_EnterClassName); status.setError(NewClassWizardMessages.NewClassCreationWizardPage_error_EnterClassName);
return status; return status;
@ -1669,7 +1670,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
} }
} }
int searchResult = NewClassWizardUtil.searchForCppType(fullyQualifiedName, project, ICPPClassType.class); int searchResult = NewClassWizardUtil.searchForCppType(fullyQualifiedName, project, ICPPClassType.class);
switch(searchResult) { switch (searchResult) {
case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT: case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT:
status.setError(NewClassWizardMessages.NewClassCreationWizardPage_error_ClassNameExists); status.setError(NewClassWizardMessages.NewClassCreationWizardPage_error_ClassNameExists);
return status; return status;
@ -1729,7 +1730,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
MultiStatus status = new MultiStatus(CUIPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$ MultiStatus status = new MultiStatus(CUIPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project.getProject()); IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project.getProject());
if (provider != null) { if (provider != null) {
//TODO get the scanner info for the actual source folder // TODO Get the scanner info for the actual source folder.
IScannerInfo info = provider.getScannerInformation(project.getProject()); IScannerInfo info = provider.getScannerInformation(project.getProject());
if (info != null) { if (info != null) {
String[] includePaths = info.getIncludePaths(); String[] includePaths = info.getIncludePaths();

View file

@ -10,7 +10,6 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.utils.ui.controls; package org.eclipse.cdt.utils.ui.controls;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Rectangle;
@ -22,34 +21,33 @@ import org.eclipse.swt.widgets.Layout;
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
*/ */
public class TabFolderLayout extends Layout { public class TabFolderLayout extends Layout {
@Override @Override
protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) { protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
return new Point(wHint, hHint); return new Point(wHint, hHint);
Control [] children = composite.getChildren (); Control[] children = composite.getChildren();
int count = children.length; int count = children.length;
int maxWidth = 0, maxHeight = 0; int maxWidth = 0, maxHeight = 0;
for (int i=0; i<count; i++) { for (int i = 0; i < count; i++) {
Control child = children [i]; Control child = children [i];
Point pt = child.computeSize (SWT.DEFAULT, SWT.DEFAULT, flushCache); Point pt = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
maxWidth = Math.max (maxWidth, pt.x); maxWidth = Math.max(maxWidth, pt.x);
maxHeight = Math.max (maxHeight, pt.y); maxHeight = Math.max(maxHeight, pt.y);
} }
if (wHint != SWT.DEFAULT) if (wHint != SWT.DEFAULT)
maxWidth= wHint; maxWidth= wHint;
if (hHint != SWT.DEFAULT) if (hHint != SWT.DEFAULT)
maxHeight= hHint; maxHeight= hHint;
return new Point(maxWidth, maxHeight); return new Point(maxWidth, maxHeight);
} }
@Override @Override
protected void layout (Composite composite, boolean flushCache) { protected void layout(Composite composite, boolean flushCache) {
Rectangle rect= composite.getClientArea(); Rectangle rect= composite.getClientArea();
Control[] children = composite.getChildren(); Control[] children = composite.getChildren();
for (int i = 0; i < children.length; i++) { for (int i = 0; i < children.length; i++) {
children[i].setBounds(rect); children[i].setBounds(rect);

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.core.model;
import org.eclipse.debug.core.commands.IDebugCommandHandler;
/**
* Command handler for the "Debug New Executable" command.
*
* @since 7.3
*/
public interface IDebugNewExecutableHandler extends IDebugCommandHandler {
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

View file

@ -242,3 +242,9 @@ OpenNewView.name = Open New View
# Disassembly Ruler Column extension point # Disassembly Ruler Column extension point
extPoint.disassemblyRulerColumn=Disassembly Ruler Column extPoint.disassemblyRulerColumn=Disassembly Ruler Column
# Debug New Executable Command
DebugNewExecutable.name=Debug New Executable
DebugNewExecutable.description=Debug a new executable
DebugNewExecutable.label=Debug New Executable...
DebugNewExecutable.tooltip=Debug a new executable

View file

@ -2012,7 +2012,12 @@
id="org.eclipse.cdt.debug.ui.command.connect" id="org.eclipse.cdt.debug.ui.command.connect"
name="%Connect.name"> name="%Connect.name">
</command> </command>
<command
categoryId="org.eclipse.cdt.debug.ui.category.debugViewLayout"
description="%DebugNewExecutable.description"
id="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
name="%DebugNewExecutable.name">
</command>
</extension> </extension>
<extension <extension
point="org.eclipse.ui.handlers"> point="org.eclipse.ui.handlers">
@ -2079,6 +2084,10 @@
class="org.eclipse.cdt.debug.internal.ui.commands.ConnectCommandHandler" class="org.eclipse.cdt.debug.internal.ui.commands.ConnectCommandHandler"
commandId="org.eclipse.cdt.debug.ui.command.connect"> commandId="org.eclipse.cdt.debug.ui.command.connect">
</handler> </handler>
<handler
class="org.eclipse.cdt.debug.internal.ui.commands.DebugNewExecutableHandler"
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable">
</handler>
</extension> </extension>
<extension <extension
point="org.eclipse.core.expressions.definitions"> point="org.eclipse.core.expressions.definitions">
@ -2520,6 +2529,28 @@
</visibleWhen> </visibleWhen>
</command> </command>
</menuContribution> </menuContribution>
<!--
<menuContribution
locationURI="toolbar:org.eclipse.debug.ui.DebugView?before=stepGroup">
<command
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
icon="icons/obj16/new_exec.gif"
label="%DebugNewExecutable.label"
style="push"
tooltip="%DebugNewExecutable.tooltip">
</command>
</menuContribution>
-->
<menuContribution
locationURI="popup:org.eclipse.debug.ui.DebugView?before=emptyLaunchGroup">
<command
commandId="org.eclipse.cdt.debug.ui.command.debugNewExecutable"
icon="icons/obj16/new_exec.gif"
label="%DebugNewExecutable.label"
style="push"
tooltip="%DebugNewExecutable.tooltip">
</command>
</menuContribution>
<!-- Connect contributions to debug view menu, toolbar menu --> <!-- Connect contributions to debug view menu, toolbar menu -->
<menuContribution <menuContribution

View file

@ -89,10 +89,13 @@ import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.ISourcePresentation;
import org.eclipse.debug.ui.IValueDetailListener; import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorInput;
@ -105,7 +108,7 @@ import com.ibm.icu.text.MessageFormat;
/** /**
* @see IDebugModelPresentation * @see IDebugModelPresentation
*/ */
public class CDebugModelPresentation extends LabelProvider implements IDebugModelPresentation { public class CDebugModelPresentation extends LabelProvider implements IDebugModelPresentation, IColorProvider {
public final static String DISPLAY_FULL_PATHS = "DISPLAY_FULL_PATHS"; //$NON-NLS-1$ public final static String DISPLAY_FULL_PATHS = "DISPLAY_FULL_PATHS"; //$NON-NLS-1$
@ -194,6 +197,14 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
} }
if ( file != null ) if ( file != null )
return new FileEditorInput( file ); return new FileEditorInput( file );
// There is no file associated with this breakpoint. See if another editor is available from an adapter
ISourcePresentation srcPres = (ISourcePresentation) Platform.getAdapterManager().getAdapter(b, ISourcePresentation.class);
if ( srcPres != null ) {
IEditorInput editor = srcPres.getEditorInput(b);
if ( editor != null ) {
return editor;
}
}
} }
if ( element instanceof FileStorage || element instanceof LocalFileStorage ) { if ( element instanceof FileStorage || element instanceof LocalFileStorage ) {
return new ExternalEditorInput( ((IStorage) element).getFullPath() ); return new ExternalEditorInput( ((IStorage) element).getFullPath() );
@ -220,7 +231,20 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
if ( input != null ) { if ( input != null ) {
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry(); IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() ); IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID; id = CUIPlugin.EDITOR_ID;
if ( descriptor != null ) {
id = descriptor.getId();
}
else if ( element instanceof ICBreakpoint ) {
// There is no associated editor ID for this breakpoint, see if an alternative can be supplied from an adapter.
ISourcePresentation sourcePres = (ISourcePresentation) Platform.getAdapterManager().getAdapter(element, ISourcePresentation.class);
if ( sourcePres != null ) {
String lid = sourcePres.getEditorId(input, element);
if ( lid != null ) {
id = lid;
}
}
}
} }
return id; return id;
} }
@ -797,4 +821,21 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
return MessageFormat.format( string, (Object[]) args ); return MessageFormat.format( string, (Object[]) args );
} }
@Override
public Color getForeground(Object element) {
IColorProvider colorProv = (IColorProvider) Platform.getAdapterManager().getAdapter(element, IColorProvider.class);
if ( colorProv != null ) {
return colorProv.getForeground(element);
}
return null;
}
@Override
public Color getBackground(Object element) {
IColorProvider colorProv = (IColorProvider) Platform.getAdapterManager().getAdapter(element, IColorProvider.class);
if ( colorProv != null ) {
return colorProv.getBackground(element);
}
return null;
}
} }

View file

@ -0,0 +1,23 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.commands;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.debug.ui.actions.DebugCommandHandler;
public class DebugNewExecutableHandler extends DebugCommandHandler {
@Override
protected Class<?> getCommandType() {
return IDebugNewExecutableHandler.class;
}
}

View file

@ -124,6 +124,12 @@ public class ReverseToggleCommandHandler extends DebugCommandHandler implements
return adapter; return adapter;
} }
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.actions.DebugCommandHandler#postExecute(org.eclipse.debug.core.IRequest, java.lang.Object[])
*
* We keep this logic for users that may not do the refresh themselves.
*/
@Override @Override
protected void postExecute(IRequest request, Object[] targets) { protected void postExecute(IRequest request, Object[] targets) {
super.postExecute(request, targets); super.postExecute(request, targets);

View file

@ -19,6 +19,7 @@ import java.util.WeakHashMap;
import org.eclipse.cdt.debug.core.model.ICBreakpoint; import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.IConnectHandler; import org.eclipse.cdt.debug.core.model.IConnectHandler;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler; import org.eclipse.cdt.debug.core.model.IResumeWithoutSignalHandler;
import org.eclipse.cdt.debug.core.model.IReverseResumeHandler; import org.eclipse.cdt.debug.core.model.IReverseResumeHandler;
import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler; import org.eclipse.cdt.debug.core.model.IReverseStepIntoHandler;
@ -49,6 +50,7 @@ import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbDisconnectCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbRestartCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.GdbSteppingModeTarget;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbConnectCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbDebugNewExecutableCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbResumeWithoutSignalCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseResumeCommand;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand; import org.eclipse.cdt.dsf.gdb.internal.ui.commands.GdbReverseStepIntoCommand;
@ -114,6 +116,7 @@ public class GdbAdapterFactory
final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand; final GdbResumeWithoutSignalCommand fResumeWithoutSignalCommand;
final GdbRestartCommand fRestartCommand; final GdbRestartCommand fRestartCommand;
final DsfTerminateCommand fTerminateCommand; final DsfTerminateCommand fTerminateCommand;
final GdbDebugNewExecutableCommand fDebugNewExecutableCommand;
final GdbConnectCommand fConnectCommand; final GdbConnectCommand fConnectCommand;
final GdbDisconnectCommand fDisconnectCommand; final GdbDisconnectCommand fDisconnectCommand;
final IDebugModelProvider fDebugModelProvider; final IDebugModelProvider fDebugModelProvider;
@ -162,7 +165,8 @@ public class GdbAdapterFactory
fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session); fResumeWithoutSignalCommand = new GdbResumeWithoutSignalCommand(session);
fRestartCommand = new GdbRestartCommand(session, fLaunch); fRestartCommand = new GdbRestartCommand(session, fLaunch);
fTerminateCommand = new DsfTerminateCommand(session); fTerminateCommand = new DsfTerminateCommand(session);
fConnectCommand = new GdbConnectCommand(session); fDebugNewExecutableCommand = new GdbDebugNewExecutableCommand(session, fLaunch);
fConnectCommand = new GdbConnectCommand(session, fLaunch);
fDisconnectCommand = new GdbDisconnectCommand(session); fDisconnectCommand = new GdbDisconnectCommand(session);
fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch); fSuspendTrigger = new GdbSuspendTrigger(session, fLaunch);
fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory(); fModelSelectionPolicyFactory = new DefaultDsfModelSelectionPolicyFactory();
@ -189,6 +193,7 @@ public class GdbAdapterFactory
session.registerModelAdapter(IRestartHandler.class, fRestartCommand); session.registerModelAdapter(IRestartHandler.class, fRestartCommand);
session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand); session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
session.registerModelAdapter(IConnectHandler.class, fConnectCommand); session.registerModelAdapter(IConnectHandler.class, fConnectCommand);
session.registerModelAdapter(IDebugNewExecutableHandler.class, fDebugNewExecutableCommand);
session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand); session.registerModelAdapter(IDisconnectHandler.class, fDisconnectCommand);
session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory); session.registerModelAdapter(IModelSelectionPolicyFactory.class, fModelSelectionPolicyFactory);
session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget); session.registerModelAdapter(IRefreshAllTarget.class, fRefreshAllTarget);
@ -249,6 +254,7 @@ public class GdbAdapterFactory
session.unregisterModelAdapter(IRestartHandler.class); session.unregisterModelAdapter(IRestartHandler.class);
session.unregisterModelAdapter(ITerminateHandler.class); session.unregisterModelAdapter(ITerminateHandler.class);
session.unregisterModelAdapter(IConnectHandler.class); session.unregisterModelAdapter(IConnectHandler.class);
session.unregisterModelAdapter(IDebugNewExecutableHandler.class);
session.unregisterModelAdapter(IDisconnectHandler.class); session.unregisterModelAdapter(IDisconnectHandler.class);
session.unregisterModelAdapter(IModelSelectionPolicyFactory.class); session.unregisterModelAdapter(IModelSelectionPolicyFactory.class);
session.unregisterModelAdapter(IRefreshAllTarget.class); session.unregisterModelAdapter(IRefreshAllTarget.class);
@ -279,6 +285,7 @@ public class GdbAdapterFactory
fRestartCommand.dispose(); fRestartCommand.dispose();
fTerminateCommand.dispose(); fTerminateCommand.dispose();
fConnectCommand.dispose(); fConnectCommand.dispose();
fDebugNewExecutableCommand.dispose();
fDisconnectCommand.dispose(); fDisconnectCommand.dispose();
fSuspendTrigger.dispose(); fSuspendTrigger.dispose();
fReverseToggleTarget.dispose(); fReverseToggleTarget.dispose();

View file

@ -20,6 +20,7 @@ import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.model.IConnectHandler; import org.eclipse.cdt.debug.core.model.IConnectHandler;
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor; import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
@ -35,9 +36,11 @@ import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.actions.IConnect; import org.eclipse.cdt.dsf.gdb.actions.IConnect;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
import org.eclipse.cdt.dsf.gdb.internal.ui.actions.ProcessInfo; import org.eclipse.cdt.dsf.gdb.internal.ui.actions.ProcessInfo;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableInfo;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.LaunchUIMessages; import org.eclipse.cdt.dsf.gdb.internal.ui.launching.LaunchUIMessages;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.ProcessPrompter; import org.eclipse.cdt.dsf.gdb.internal.ui.launching.ProcessPrompter;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.ProcessPrompter.PrompterInfo; import org.eclipse.cdt.dsf.gdb.internal.ui.launching.ProcessPrompter.PrompterInfo;
@ -68,7 +71,8 @@ import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.progress.UIJob; import org.eclipse.ui.progress.UIJob;
public class GdbConnectCommand extends AbstractDebugCommand implements IConnectHandler, IConnect { public class GdbConnectCommand extends AbstractDebugCommand implements IConnectHandler, IConnect {
private final GdbLaunch fLaunch;
private final DsfExecutor fExecutor; private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker; private final DsfServicesTracker fTracker;
@ -82,7 +86,8 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
// the binary location for a local attach session. // the binary location for a local attach session.
private Map<String, String> fProcessNameToBinaryMap = new HashMap<String, String>(); private Map<String, String> fProcessNameToBinaryMap = new HashMap<String, String>();
public GdbConnectCommand(DsfSession session) { public GdbConnectCommand(DsfSession session, GdbLaunch launch) {
fLaunch = launch;
fExecutor = session.getExecutor(); fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId());
} }
@ -143,10 +148,12 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
IProcessExtendedInfo[] fProcessList = null; IProcessExtendedInfo[] fProcessList = null;
DataRequestMonitor<Object> fRequestMonitor; DataRequestMonitor<Object> fRequestMonitor;
boolean fNewProcessSupported; boolean fNewProcessSupported;
boolean fRemote;
public PromptForPidJob(String name, boolean newProcessSupported, IProcessExtendedInfo[] procs, DataRequestMonitor<Object> rm) { public PromptForPidJob(String name, boolean newProcessSupported, boolean remote, IProcessExtendedInfo[] procs, DataRequestMonitor<Object> rm) {
super(name); super(name);
fNewProcessSupported = newProcessSupported; fNewProcessSupported = newProcessSupported;
fRemote = remote;
fProcessList = procs; fProcessList = procs;
fRequestMonitor = rm; fRequestMonitor = rm;
} }
@ -158,11 +165,11 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
null); null);
try { try {
PrompterInfo info = new PrompterInfo(fNewProcessSupported, fProcessList); PrompterInfo info = new PrompterInfo(fNewProcessSupported, fRemote, fProcessList);
Object result = new ProcessPrompter().handleStatus(null, info); Object result = new ProcessPrompter().handleStatus(null, info);
if (result == null) { if (result == null) {
fRequestMonitor.cancel(); fRequestMonitor.cancel();
} else if (result instanceof IProcessExtendedInfo[] || result instanceof String) { } else if (result instanceof IProcessExtendedInfo[] || result instanceof NewExecutableInfo) {
fRequestMonitor.setData(result); fRequestMonitor.setData(result);
} else if (result instanceof Integer) { } else if (result instanceof Integer) {
// This is the case where the user typed in a pid number directly // This is the case where the user typed in a pid number directly
@ -288,9 +295,11 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
public void run() { public void run() {
final IProcesses procService = fTracker.getService(IProcesses.class); final IProcesses procService = fTracker.getService(IProcesses.class);
ICommandControlService commandControl = fTracker.getService(ICommandControlService.class); ICommandControlService commandControl = fTracker.getService(ICommandControlService.class);
IGDBBackend backend = fTracker.getService(IGDBBackend.class);
if (procService != null && commandControl != null) { if (procService != null && commandControl != null && backend != null) {
final ICommandControlDMContext controlCtx = commandControl.getContext(); final ICommandControlDMContext controlCtx = commandControl.getContext();
final boolean remote = backend.getSessionType() == SessionType.REMOTE;
// First check if the "New..." button should be enabled. // First check if the "New..." button should be enabled.
procService.isDebugNewProcessSupported(controlCtx, new DataRequestMonitor<Boolean>(fExecutor, rm) { procService.isDebugNewProcessSupported(controlCtx, new DataRequestMonitor<Boolean>(fExecutor, rm) {
@ -314,7 +323,8 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
// Prompt the user to choose one or more processes, or to start a new one // Prompt the user to choose one or more processes, or to start a new one
new PromptForPidJob( new PromptForPidJob(
LaunchUIMessages.getString("ProcessPrompter.PromptJob"), //$NON-NLS-1$ LaunchUIMessages.getString("ProcessPrompter.PromptJob"), //$NON-NLS-1$
newProcessSupported, newProcessSupported,
remote,
procInfoList.toArray(new IProcessExtendedInfo[procInfoList.size()]), procInfoList.toArray(new IProcessExtendedInfo[procInfoList.size()]),
new DataRequestMonitor<Object>(fExecutor, rm) { new DataRequestMonitor<Object>(fExecutor, rm) {
@Override @Override
@ -325,9 +335,9 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
@Override @Override
protected void handleSuccess() { protected void handleSuccess() {
Object data = getData(); Object data = getData();
if (data instanceof String) { if (data instanceof NewExecutableInfo) {
// User wants to start a new process // User wants to start a new process
startNewProcess(controlCtx, (String)data, rm); startNewProcess(controlCtx, (NewExecutableInfo)data, rm);
} else if (data instanceof IProcessExtendedInfo[]) { } else if (data instanceof IProcessExtendedInfo[]) {
attachToProcesses(controlCtx, (IProcessExtendedInfo[])data, rm); attachToProcesses(controlCtx, (IProcessExtendedInfo[])data, rm);
} else { } else {
@ -412,11 +422,23 @@ public class GdbConnectCommand extends AbstractDebugCommand implements IConnectH
}); });
} }
private void startNewProcess(ICommandControlDMContext controlDmc, String binaryPath, RequestMonitor rm) { private void startNewProcess(ICommandControlDMContext controlDmc, NewExecutableInfo info, RequestMonitor rm) {
IGDBProcesses procService = fTracker.getService(IGDBProcesses.class); IGDBProcesses procService = fTracker.getService(IGDBProcesses.class);
procService.debugNewProcess( try {
controlDmc, binaryPath, @SuppressWarnings("unchecked")
new HashMap<String, Object>(), new DataRequestMonitor<IDMContext>(fExecutor, rm)); Map<String, Object> attributes = fLaunch.getLaunchConfiguration().getAttributes();
attributes.put(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, info.getTargetPath());
attributes.put(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, info.getArguments());
procService.debugNewProcess(
controlDmc,
info.getHostPath(),
attributes,
new DataRequestMonitor<IDMContext>(fExecutor, rm));
}
catch(CoreException e) {
rm.setStatus(e.getStatus());
rm.done();
}
} }
private void attachToProcesses(final ICommandControlDMContext controlDmc, IProcessExtendedInfo[] processes, final RequestMonitor rm) { private void attachToProcesses(final ICommandControlDMContext controlDmc, IProcessExtendedInfo[] processes, final RequestMonitor rm) {

View file

@ -0,0 +1,213 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
import java.util.Map;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableInfo;
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableDialog;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.AbstractDebugCommand;
import org.eclipse.debug.core.commands.IEnabledStateRequest;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.progress.UIJob;
public class GdbDebugNewExecutableCommand extends AbstractDebugCommand implements IDebugNewExecutableHandler {
private class PromptJob extends UIJob {
private DataRequestMonitor<NewExecutableInfo> fRequestMonitor;
private boolean fRemote = false;
private PromptJob( boolean remote, DataRequestMonitor<NewExecutableInfo> rm ) {
super( Messages.GdbDebugNewExecutableCommand_New_Executable_Prompt_Job );
fRemote = remote;
fRequestMonitor = rm;
}
@Override
public IStatus runInUIThread( IProgressMonitor monitor ) {
int flags = ( fRemote ) ? NewExecutableDialog.REMOTE : 0;
NewExecutableDialog dialog = new NewExecutableDialog( GdbUIPlugin.getShell(), flags );
final boolean canceled = dialog.open() == Window.CANCEL;
final NewExecutableInfo info = dialog.getExecutableInfo();
fExecutor.execute( new DsfRunnable() {
@Override
public void run() {
if ( canceled )
fRequestMonitor.cancel();
else
fRequestMonitor.setData( info );
fRequestMonitor.done();
}
} );
return Status.OK_STATUS;
}
}
private final GdbLaunch fLaunch;
private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker;
public GdbDebugNewExecutableCommand( DsfSession session, GdbLaunch launch ) {
super();
fLaunch = launch;
fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker( GdbUIPlugin.getBundleContext(), session.getId() );
}
public boolean canDebugNewExecutable() {
Query<Boolean> canDebugQuery = new Query<Boolean>() {
@Override
public void execute( DataRequestMonitor<Boolean> rm ) {
IProcesses procService = fTracker.getService( IProcesses.class );
ICommandControlService commandControl = fTracker.getService( ICommandControlService.class );
if ( procService == null || commandControl == null ) {
rm.setData( false );
rm.done();
return;
}
procService.isDebugNewProcessSupported( commandControl.getContext(), rm );
}
};
try {
fExecutor.execute( canDebugQuery );
return canDebugQuery.get();
}
catch( InterruptedException e ) {
}
catch( ExecutionException e ) {
}
catch( RejectedExecutionException e ) {
// Can be thrown if the session is shutdown
}
return false;
}
public void debugNewExecutable( final RequestMonitor rm ) {
IGDBBackend backend = fTracker.getService( IGDBBackend.class );
final IProcesses procService = fTracker.getService( IProcesses.class );
final ICommandControlService commandControl = fTracker.getService( ICommandControlService.class );
if ( backend == null || procService == null || commandControl == null ) {
rm.setStatus( new Status( IStatus.ERROR, GdbUIPlugin.PLUGIN_ID, "Service is not available" ) ); //$NON-NLS-1$
rm.done();
return;
}
PromptJob job = new PromptJob(
backend.getSessionType() == SessionType.REMOTE,
new DataRequestMonitor<NewExecutableInfo>( fExecutor, rm ){
@Override
protected void handleCancel() {
rm.cancel();
rm.done();
};
@Override
protected void handleSuccess() {
try {
@SuppressWarnings( "unchecked" )
Map<String, Object> attributes = getLaunchConfiguration().getAttributes();
attributes.put( IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, getData().getTargetPath() );
attributes.put( ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, getData().getArguments() );
procService.debugNewProcess(
commandControl.getContext(),
getData().getHostPath(),
attributes,
new ImmediateDataRequestMonitor<IDMContext>( rm ) );
}
catch( CoreException e ) {
rm.setStatus( e.getStatus() );
rm.done();
}
};
} );
job.schedule();
}
@Override
protected void doExecute( Object[] targets, IProgressMonitor monitor, IRequest request ) throws CoreException {
Query<Boolean> query = new Query<Boolean>() {
@Override
protected void execute( DataRequestMonitor<Boolean> rm ) {
debugNewExecutable( rm );
}
};
try {
fExecutor.execute( query );
query.get();
}
catch( InterruptedException e ) {
}
catch( ExecutionException e ) {
}
catch( CancellationException e ) {
// Nothing to do, just ignore the command since the user
// cancelled it.
}
catch( RejectedExecutionException e ) {
// Can be thrown if the session is shutdown
}
}
@Override
protected boolean isExecutable( Object[] targets, IProgressMonitor monitor, IEnabledStateRequest request ) throws CoreException {
return canDebugNewExecutable();
}
@Override
protected Object getTarget( Object element ) {
if ( element instanceof GdbLaunch || element instanceof IDMVMContext )
return element;
return null;
}
public void dispose() {
fTracker.dispose();
}
private ILaunchConfiguration getLaunchConfiguration() {
return fLaunch.getLaunchConfiguration();
}
}

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009 Ericsson and others. * Copyright (c) 2009, 2013 Ericsson 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
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Ericsson - initial API and implementation * Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Listen for IReverseModeChangedDMEvent (Bug 399163)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands; package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
@ -16,6 +17,7 @@ import java.util.concurrent.RejectedExecutionException;
import org.eclipse.cdt.debug.core.model.IReverseToggleHandler; import org.eclipse.cdt.debug.core.model.IReverseToggleHandler;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.Query; import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.datamodel.IDMContext;
@ -24,15 +26,23 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
import org.eclipse.cdt.dsf.gdb.service.IReverseRunControl; import org.eclipse.cdt.dsf.gdb.service.IReverseRunControl;
import org.eclipse.cdt.dsf.gdb.service.IReverseRunControl.IReverseModeChangedDMEvent;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.IRequest; import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.AbstractDebugCommand; import org.eclipse.debug.core.commands.AbstractDebugCommand;
import org.eclipse.debug.core.commands.IDebugCommandRequest; import org.eclipse.debug.core.commands.IDebugCommandRequest;
import org.eclipse.debug.core.commands.IEnabledStateRequest; import org.eclipse.debug.core.commands.IEnabledStateRequest;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.progress.WorkbenchJob;
import org.eclipse.ui.services.IEvaluationService;
/** /**
* Command that toggles the Reverse Debugging feature * Command that toggles the Reverse Debugging feature
@ -42,13 +52,33 @@ import org.eclipse.debug.core.commands.IEnabledStateRequest;
public class GdbReverseToggleCommand extends AbstractDebugCommand implements IReverseToggleHandler { public class GdbReverseToggleCommand extends AbstractDebugCommand implements IReverseToggleHandler {
private final DsfExecutor fExecutor; private final DsfExecutor fExecutor;
private final DsfServicesTracker fTracker; private final DsfServicesTracker fTracker;
private final DsfSession fSession;
public GdbReverseToggleCommand(DsfSession session) { public GdbReverseToggleCommand(DsfSession session) {
fExecutor = session.getExecutor(); fExecutor = session.getExecutor();
fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId()); fTracker = new DsfServicesTracker(GdbUIPlugin.getBundleContext(), session.getId());
fSession = session;
try {
fExecutor.execute(new DsfRunnable() {
@Override
public void run() {
fSession.addServiceEventListener(GdbReverseToggleCommand.this, null);
}
});
} catch(RejectedExecutionException e) {}
} }
public void dispose() { public void dispose() {
try {
fExecutor.execute(new DsfRunnable() {
@Override
public void run() {
fSession.removeServiceEventListener(GdbReverseToggleCommand.this);
}
});
} catch (RejectedExecutionException e) {
// Session already gone.
}
fTracker.dispose(); fTracker.dispose();
} }
@ -195,4 +225,30 @@ public class GdbReverseToggleCommand extends AbstractDebugCommand implements IRe
return false; return false;
} }
/**
* @noreference This method is not intended to be referenced by clients.
*/
@DsfServiceEventHandler
public void eventDispatched(IReverseModeChangedDMEvent e) {
new WorkbenchJob("") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
// Request re-evaluation of property "org.eclipse.cdt.debug.ui.isReverseDebuggingEnabled" to update
// visibility of reverse stepping commands.
IEvaluationService exprService = (IEvaluationService) PlatformUI.getWorkbench().getService(IEvaluationService.class);
if (exprService != null) {
exprService.requestEvaluation("org.eclipse.cdt.debug.ui.isReverseDebuggingEnabled"); //$NON-NLS-1$
}
// Refresh reverse toggle commands with the new state of reverse enabled.
// This is in order to keep multiple toggle actions in UI in sync.
ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
if (commandService != null) {
commandService.refreshElements("org.eclipse.cdt.debug.ui.command.reverseToggle", null); //$NON-NLS-1$
}
return Status.OK_STATUS;
}
}.schedule();
}
} }

View file

@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Ericsson - initial API and implementation * Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Instruction-level step-return does not make sense (bug 399123)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands; package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
@ -26,7 +27,6 @@ public class GdbUncallCommand extends GdbAbstractReverseStepCommand implements I
@Override @Override
protected final StepType getStepType() { protected final StepType getStepType() {
boolean instructionSteppingEnabled = getSteppingMode() != null && getSteppingMode().isInstructionSteppingEnabled(); return StepType.STEP_RETURN;
return instructionSteppingEnabled ? StepType.INSTRUCTION_STEP_RETURN : StepType.STEP_RETURN;
} }
} }

View file

@ -0,0 +1,58 @@
/*******************************************************************************
* Copyright (c) 2012 Mentor Graphics 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.commands;
import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
public static String GdbDebugNewExecutableCommand_Arguments;
public static String GdbDebugNewExecutableCommand_Binary;
public static String GdbDebugNewExecutableCommand_Binary_file_does_not_exist;
public static String GdbDebugNewExecutableCommand_Binary_must_be_specified;
public static String GdbDebugNewExecutableCommand_Binary_on_host;
public static String GdbDebugNewExecutableCommand_Binary_on_target;
public static String GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified;
public static String GdbDebugNewExecutableCommand_Browse;
public static String GdbDebugNewExecutableCommand_Debug_New_Executable;
public static String GdbDebugNewExecutableCommand_Host_binary_file_does_not_exist;
public static String GdbDebugNewExecutableCommand_Host_binary_must_be_specified;
public static String GdbDebugNewExecutableCommand_Invalid_binary;
public static String GdbDebugNewExecutableCommand_Invalid_host_binary;
public static String GdbDebugNewExecutableCommand_New_Executable_Prompt_Job;
public static String GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target;
public static String GdbDebugNewExecutableCommand_Select_Binary;
public static String GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments;
static {
// initialize resource bundle
NLS.initializeMessages( Messages.class.getName(), Messages.class );
}
private Messages() {
}
}

View file

@ -0,0 +1,28 @@
###############################################################################
# Copyright (c) 2012 Mentor Graphics 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
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
# Mentor Graphics - Initial API and implementation
###############################################################################
GdbDebugNewExecutableCommand_Arguments=Arguments:
GdbDebugNewExecutableCommand_Binary=Binary:
GdbDebugNewExecutableCommand_Binary_file_does_not_exist=Binary file does not exist
GdbDebugNewExecutableCommand_Binary_must_be_specified=Binary must be specified
GdbDebugNewExecutableCommand_Binary_on_host=Binary on host:
GdbDebugNewExecutableCommand_Binary_on_target=Binary on target:
GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified=Binary on target must be specified
GdbDebugNewExecutableCommand_Browse=Browse...
GdbDebugNewExecutableCommand_Debug_New_Executable=Debug New Executable
GdbDebugNewExecutableCommand_Host_binary_file_does_not_exist=Host binary file does not exist
GdbDebugNewExecutableCommand_Host_binary_must_be_specified=Host binary must be specified
GdbDebugNewExecutableCommand_Invalid_binary=Invalid binary
GdbDebugNewExecutableCommand_Invalid_host_binary=Invalid host binary
GdbDebugNewExecutableCommand_New_Executable_Prompt_Job=New Executable Prompt Job
GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target=Select binaries on the host and the target and specify the arguments
GdbDebugNewExecutableCommand_Select_Binary=Select Binary
GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments=Select a binary and specify the arguments

View file

@ -0,0 +1,169 @@
/*******************************************************************************
* Copyright (c) 2013 Mentor Graphics 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mentor Graphics - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
import java.io.File;
import org.eclipse.cdt.dsf.gdb.internal.ui.commands.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class NewExecutableDialog extends TitleAreaDialog {
public static final int REMOTE = 0x1;
private int fFlags = 0;
private NewExecutableInfo fInfo = null;
private Text fHostBinaryText;
private Text fTargetBinaryText;
private Text fArgumentsText;
public NewExecutableDialog( Shell parentShell, int flags ) {
super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
fFlags = flags;
}
@Override
protected Control createContents( Composite parent ) {
Control control = super.createContents( parent );
validate();
return control;
}
@Override
protected Control createDialogArea( Composite parent ) {
boolean remote = (fFlags & REMOTE) > 0;
getShell().setText( Messages.GdbDebugNewExecutableCommand_Debug_New_Executable );
setTitle( Messages.GdbDebugNewExecutableCommand_Select_Binary );
String message = ( remote ) ?
Messages.GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target :
Messages.GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments;
setMessage( message );
Composite control = (Composite)super.createDialogArea( parent );
Composite comp = new Composite( control, SWT.NONE );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
GridLayout layout = new GridLayout( 3, false );
comp.setLayout( layout );
comp.setLayoutData( gd );
new Label( comp, SWT.None ).setText( remote ? Messages.GdbDebugNewExecutableCommand_Binary_on_host : Messages.GdbDebugNewExecutableCommand_Binary );
fHostBinaryText = new Text( comp, SWT.BORDER );
fHostBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
fHostBinaryText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
Button browseButton = new Button( comp, SWT.PUSH );
browseButton.setText( Messages.GdbDebugNewExecutableCommand_Browse );
browseButton.setFont( JFaceResources.getDialogFont() );
setButtonLayoutData( browseButton );
browseButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
FileDialog dialog = new FileDialog( getShell() );
dialog.setFileName( fHostBinaryText.getText() );
String result = dialog.open();
if ( result != null ) {
fHostBinaryText.setText( result );
}
}
} );
if ( remote ) {
new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Binary_on_target );
fTargetBinaryText = new Text( comp, SWT.BORDER );
fTargetBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
fTargetBinaryText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
}
new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Arguments );
fArgumentsText = new Text( comp, SWT.BORDER );
fArgumentsText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
return control;
}
@Override
protected void okPressed() {
String targetPath = ( fTargetBinaryText != null ) ? fTargetBinaryText.getText().trim() : null;
String args = fArgumentsText.getText().trim();
fInfo = new NewExecutableInfo( fHostBinaryText.getText().trim(), targetPath, args );
super.okPressed();
}
public NewExecutableInfo getExecutableInfo() {
return fInfo;
}
private void validate() {
boolean remote = (fFlags & REMOTE) > 0;
StringBuilder sb = new StringBuilder();
String hostBinary = fHostBinaryText.getText().trim();
if ( hostBinary.isEmpty() ) {
sb.append( ( remote ) ?
Messages.GdbDebugNewExecutableCommand_Host_binary_must_be_specified :
Messages.GdbDebugNewExecutableCommand_Binary_must_be_specified );
}
else {
File file = new File( hostBinary );
if ( !file.exists() ) {
sb.append( ( remote ) ?
Messages.GdbDebugNewExecutableCommand_Host_binary_file_does_not_exist :
Messages.GdbDebugNewExecutableCommand_Binary_file_does_not_exist );
}
else if ( file.isDirectory() ) {
sb.append( ( remote ) ?
Messages.GdbDebugNewExecutableCommand_Invalid_host_binary :
Messages.GdbDebugNewExecutableCommand_Invalid_binary );
}
}
if ( fTargetBinaryText != null ) {
if ( fTargetBinaryText.getText().trim().length() == 0 ) {
if ( sb.length() != 0 ) {
sb.append( "\n " ); //$NON-NLS-1$
}
sb.append( Messages.GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified );
}
}
setErrorMessage( ( sb.length() != 0 ) ? sb.toString() : null );
getButton( IDialogConstants.OK_ID ).setEnabled( getErrorMessage() == null );
}
}

Some files were not shown because too many files have changed in this diff Show more