mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 08:55:25 +02:00
Bug 442457 - Support for __final keyword
Change-Id: I8eb4ea82a4b0a462cb373c5a6b1efc9ba7addf82 Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/32367 Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
parent
dc3a09bbce
commit
83169e23d6
8 changed files with 95 additions and 12 deletions
|
@ -10094,7 +10094,7 @@ public class AST2CPPTests extends AST2TestBase {
|
|||
assertInstance(sDefinition, ICPPASTCompositeTypeSpecifier.class);
|
||||
assertTrue(((ICPPASTCompositeTypeSpecifier)sDefinition).isFinal());
|
||||
}
|
||||
|
||||
|
||||
// struct S {
|
||||
// template<typename T>
|
||||
// void foo(T t) final {
|
||||
|
@ -10134,6 +10134,16 @@ public class AST2CPPTests extends AST2TestBase {
|
|||
public void testFinalParameter() throws Exception {
|
||||
parseAndCheckBindings();
|
||||
}
|
||||
|
||||
// struct S __final {};
|
||||
// struct T { void foo() __final; };
|
||||
public void testFinalGccExtension_442457() throws Exception {
|
||||
BindingAssertionHelper bh = getAssertionHelper();
|
||||
ICPPClassType s = bh.assertNonProblem("S");
|
||||
assertTrue(s.isFinal());
|
||||
ICPPMethod foo = bh.assertNonProblem("foo");
|
||||
assertTrue(foo.isFinal());
|
||||
}
|
||||
|
||||
// struct S1 {};
|
||||
// S1 s1;
|
||||
|
|
|
@ -11,8 +11,13 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.dom.parser.cpp;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
|
||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||
import org.eclipse.cdt.core.parser.IToken.ContextSensitiveTokenType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.GCCBuiltinSymbolProvider;
|
||||
|
||||
|
||||
|
@ -161,4 +166,12 @@ public abstract class AbstractCPPParserExtensionConfiguration implements ICPPPar
|
|||
public IBuiltinBindingsProvider getBuiltinBindingsProvider() {
|
||||
return new GCCBuiltinSymbolProvider(ParserLanguage.CPP, supportGCCOtherBuiltinSymbols());
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 5.9
|
||||
*/
|
||||
@Override
|
||||
public Map<String, ContextSensitiveTokenType> getAdditionalContextSensitiveKeywords() {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,8 +12,13 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.dom.parser.cpp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
|
||||
import org.eclipse.cdt.core.parser.GCCKeywords;
|
||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||
import org.eclipse.cdt.core.parser.IToken.ContextSensitiveTokenType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.GCCBuiltinSymbolProvider;
|
||||
|
||||
/**
|
||||
|
@ -131,4 +136,12 @@ public class GPPParserExtensionConfiguration extends AbstractCPPParserExtensionC
|
|||
public IBuiltinBindingsProvider getBuiltinBindingsProvider() {
|
||||
return new GCCBuiltinSymbolProvider(ParserLanguage.CPP, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ContextSensitiveTokenType> getAdditionalContextSensitiveKeywords() {
|
||||
Map<String, ContextSensitiveTokenType> result =
|
||||
new HashMap<>(super.getAdditionalContextSensitiveKeywords());
|
||||
result.put(GCCKeywords.__FINAL, ContextSensitiveTokenType.FINAL);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,8 +13,11 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.dom.parser.cpp;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
|
||||
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
|
||||
import org.eclipse.cdt.core.parser.IToken.ContextSensitiveTokenType;
|
||||
|
||||
/**
|
||||
* C++ parser extension configuration interface.
|
||||
|
@ -146,6 +149,12 @@ public interface ICPPParserExtensionConfiguration {
|
|||
*/
|
||||
public boolean supportFunctionStyleAssembler();
|
||||
|
||||
/**
|
||||
* Additional variants of context-sensitive keywords.
|
||||
* @since 5.9
|
||||
*/
|
||||
public Map<String, ContextSensitiveTokenType> getAdditionalContextSensitiveKeywords();
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #getBuiltinBindingsProvider()} instead.
|
||||
*/
|
||||
|
|
|
@ -29,6 +29,8 @@ public class GCCKeywords {
|
|||
public static final String __INT128 = "__int128";
|
||||
/** @since 5.5 */
|
||||
public static final String __FLOAT128 = "__float128";
|
||||
/** @since 5.9 */
|
||||
public static final String __FINAL = "__final";
|
||||
|
||||
public static final char[]
|
||||
cpTYPEOF = TYPEOF.toCharArray(),
|
||||
|
@ -84,4 +86,8 @@ public class GCCKeywords {
|
|||
public static final char[]
|
||||
cp__is_final= "__is_final".toCharArray(),
|
||||
cp__underlying_type= "__underlying_type".toCharArray();
|
||||
|
||||
/** @since 5.9 */
|
||||
public static final char[]
|
||||
cp__FINAL= __FINAL.toCharArray();
|
||||
}
|
||||
|
|
|
@ -216,6 +216,15 @@ public interface IToken {
|
|||
|
||||
int FIRST_RESERVED_IExtensionToken = 243;
|
||||
int LAST_RESERVED_IExtensionToken = 299;
|
||||
|
||||
/**
|
||||
* Token types for context-sensitive tokens.
|
||||
* @since 5.9
|
||||
*/
|
||||
enum ContextSensitiveTokenType {
|
||||
OVERRIDE,
|
||||
FINAL
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -65,6 +65,8 @@ public class Keywords {
|
|||
public static final String EXPORT = "export";
|
||||
public static final String EXTERN = "extern";
|
||||
public static final String FALSE = "false";
|
||||
/** @since 5.9 */
|
||||
public static final String FINAL = "final";
|
||||
public static final String FLOAT = "float";
|
||||
public static final String FOR = "for";
|
||||
public static final String FRIEND = "friend";
|
||||
|
@ -86,6 +88,8 @@ public class Keywords {
|
|||
public static final String OPERATOR = "operator";
|
||||
public static final String OR = "or";
|
||||
public static final String OR_EQ = "or_eq";
|
||||
/** @since 5.9 */
|
||||
public static final String OVERRIDE = "override";
|
||||
public static final String PRIVATE = "private";
|
||||
public static final String PROTECTED = "protected";
|
||||
public static final String PUBLIC = "public";
|
||||
|
@ -169,7 +173,7 @@ public class Keywords {
|
|||
public static final char[] cFLOAT = "float".toCharArray();
|
||||
public static final char[] cFOR = "for".toCharArray();
|
||||
/** @since 5.5 */
|
||||
public static final char[] cFINAL = "final".toCharArray();
|
||||
public static final char[] cFINAL = FINAL.toCharArray();
|
||||
public static final char[] cFRIEND = "friend".toCharArray();
|
||||
public static final char[] cGOTO = "goto".toCharArray();
|
||||
public static final char[] cIF = "if".toCharArray();
|
||||
|
@ -189,7 +193,7 @@ public class Keywords {
|
|||
public static final char[] cOR = "or".toCharArray();
|
||||
public static final char[] cOR_EQ = "or_eq".toCharArray();
|
||||
/** @since 5.5 */
|
||||
public static final char[] cOVERRIDE = "override".toCharArray();
|
||||
public static final char[] cOVERRIDE = OVERRIDE.toCharArray();
|
||||
public static final char[] cPRIVATE = "private".toCharArray();
|
||||
public static final char[] cPROTECTED = "protected".toCharArray();
|
||||
public static final char[] cPUBLIC = "public".toCharArray();
|
||||
|
|
|
@ -19,9 +19,10 @@
|
|||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
|
@ -145,6 +146,7 @@ import org.eclipse.cdt.core.parser.IParserLogService;
|
|||
import org.eclipse.cdt.core.parser.IProblem;
|
||||
import org.eclipse.cdt.core.parser.IScanner;
|
||||
import org.eclipse.cdt.core.parser.IToken;
|
||||
import org.eclipse.cdt.core.parser.IToken.ContextSensitiveTokenType;
|
||||
import org.eclipse.cdt.core.parser.Keywords;
|
||||
import org.eclipse.cdt.core.parser.ParserMode;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
|
@ -189,6 +191,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
|
||||
private final ICPPNodeFactory nodeFactory;
|
||||
private TemplateIdStrategy fTemplateParameterListStrategy;
|
||||
|
||||
private Map<String, ContextSensitiveTokenType> fContextSensitiveTokens;
|
||||
|
||||
public GNUCPPSourceParser(IScanner scanner, ParserMode mode,
|
||||
IParserLogService log, ICPPParserExtensionConfiguration config) {
|
||||
|
@ -215,8 +219,25 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
this.index= index;
|
||||
this.nodeFactory = CPPNodeFactory.getDefault();
|
||||
scanner.setSplitShiftROperator(true);
|
||||
fContextSensitiveTokens = createContextSensitiveTokenMap(config);
|
||||
}
|
||||
|
||||
|
||||
private Map<String, ContextSensitiveTokenType> createContextSensitiveTokenMap(
|
||||
ICPPParserExtensionConfiguration config) {
|
||||
Map<String, ContextSensitiveTokenType> result = new HashMap<String, ContextSensitiveTokenType>();
|
||||
result.put(Keywords.OVERRIDE, ContextSensitiveTokenType.OVERRIDE);
|
||||
result.put(Keywords.FINAL, ContextSensitiveTokenType.FINAL);
|
||||
result.putAll(config.getAdditionalContextSensitiveKeywords());
|
||||
return result;
|
||||
}
|
||||
|
||||
private ContextSensitiveTokenType getContextSensitiveType(IToken token) {
|
||||
if (!(token.getType() == IToken.tIDENTIFIER)) {
|
||||
return null;
|
||||
}
|
||||
return fContextSensitiveTokens.get(new String(token.getCharImage()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IASTName identifier() throws EndOfFileException, BacktrackException {
|
||||
switch (LT(1)) {
|
||||
|
@ -3640,16 +3661,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
throws EndOfFileException, BacktrackException {
|
||||
while (true) {
|
||||
IToken token = LAcatchEOF(1);
|
||||
if (token.getType() != IToken.tIDENTIFIER)
|
||||
break;
|
||||
char[] tokenImage = token.getCharImage();
|
||||
if (Arrays.equals(Keywords.cOVERRIDE, tokenImage)) {
|
||||
ContextSensitiveTokenType contextSensitiveType = getContextSensitiveType(token);
|
||||
if (contextSensitiveType == ContextSensitiveTokenType.OVERRIDE) {
|
||||
consume();
|
||||
ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier(
|
||||
ICPPASTVirtSpecifier.SpecifierKind.Override);
|
||||
setRange(spec, token.getOffset(), token.getOffset() + token.getLength());
|
||||
typeRelevantDtor.addVirtSpecifier(spec);
|
||||
} else if (Arrays.equals(Keywords.cFINAL, tokenImage)) {
|
||||
} else if (contextSensitiveType == ContextSensitiveTokenType.FINAL) {
|
||||
consume();
|
||||
ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier(
|
||||
ICPPASTVirtSpecifier.SpecifierKind.Final);
|
||||
|
@ -4489,8 +4508,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
*/
|
||||
private void classVirtSpecifier(ICPPASTCompositeTypeSpecifier astClassSpecifier) throws EndOfFileException, BacktrackException {
|
||||
IToken token = LA();
|
||||
char[] tokenImage = token.getCharImage();
|
||||
if (token.getType() == IToken.tIDENTIFIER && Arrays.equals(Keywords.cFINAL, tokenImage)){
|
||||
ContextSensitiveTokenType contextSensitiveType = getContextSensitiveType(token);
|
||||
if (contextSensitiveType == ContextSensitiveTokenType.FINAL) {
|
||||
consume();
|
||||
ICPPASTClassVirtSpecifier spec = nodeFactory.newClassVirtSpecifier(
|
||||
ICPPASTClassVirtSpecifier.SpecifierKind.Final);
|
||||
|
|
Loading…
Add table
Reference in a new issue