Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java161
1 files changed, 161 insertions, 0 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java
new file mode 100644
index 00000000000..5eeb45f2fd7
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalNaryTypeId.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2017 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
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
+
+import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+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.ICPPASTNaryTypeIdExpression.Operator;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
+import org.eclipse.cdt.internal.core.dom.parser.DependentValue;
+import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
+import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
+import org.eclipse.cdt.internal.core.dom.parser.ValueFactory;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Evaluation for a n-ary type-id expression.
+ */
+public class EvalNaryTypeId extends CPPDependentEvaluation {
+ private final Operator fOperator;
+ private final IType[] fOperands;
+
+ private boolean fCheckedValueDependent;
+ private boolean fIsValueDependent;
+
+ public EvalNaryTypeId(Operator operator, IType[] operands, IASTNode pointOfDefinition) {
+ this(operator, operands, findEnclosingTemplate(pointOfDefinition));
+ }
+
+ public EvalNaryTypeId(Operator operator, IType[] operands, IBinding templateDefinition) {
+ super(templateDefinition);
+ fOperator = operator;
+ fOperands = operands;
+ }
+
+ public Operator getOperator() {
+ return fOperator;
+ }
+
+ public IType[] getOperands() {
+ return fOperands;
+ }
+
+ @Override
+ public boolean isInitializerList() {
+ return false;
+ }
+
+ @Override
+ public boolean isFunctionSet() {
+ return false;
+ }
+
+ @Override
+ public boolean isTypeDependent() {
+ return false;
+ }
+
+ @Override
+ public boolean isValueDependent() {
+ if (!fCheckedValueDependent) {
+ for (IType operand : fOperands) {
+ if (CPPTemplates.isDependentType(operand)) {
+ fIsValueDependent = true;
+ }
+ }
+ fCheckedValueDependent = true;
+ }
+ return fIsValueDependent;
+ }
+
+ @Override
+ public boolean isConstantExpression() {
+ return true;
+ }
+
+ @Override
+ public IType getType() {
+ switch (fOperator) {
+ case __is_trivially_constructible:
+ return CPPBasicType.BOOLEAN;
+ }
+ return ProblemType.UNKNOWN_FOR_EXPRESSION;
+ }
+
+ @Override
+ public IValue getValue() {
+ if (isValueDependent()) {
+ return DependentValue.create(this);
+ }
+
+ return ValueFactory.evaluateNaryTypeIdExpression(fOperator, fOperands, getTemplateDefinition());
+ }
+
+ @Override
+ public ValueCategory getValueCategory() {
+ return ValueCategory.PRVALUE;
+ }
+
+ @Override
+ public ICPPEvaluation instantiate(InstantiationContext context, int maxDepth) {
+ IType[] operands = CPPTemplates.instantiateTypes(fOperands, context);
+ if (operands == fOperands) {
+ return this;
+ }
+ return new EvalNaryTypeId(fOperator, operands, getTemplateDefinition());
+ }
+
+ @Override
+ public ICPPEvaluation computeForFunctionCall(ActivationRecord record,
+ ConstexprEvaluationContext context) {
+ return this;
+ }
+
+ @Override
+ public int determinePackSize(ICPPTemplateParameterMap tpMap) {
+ int result = 0;
+ for (int i = 0; i < fOperands.length; i++) {
+ result = CPPTemplates.combinePackSize(result,
+ CPPTemplates.determinePackSize(fOperands[i], tpMap));
+ }
+ return result;
+ }
+
+ @Override
+ public boolean referencesTemplateParameter() {
+ return isValueDependent();
+ }
+
+ @Override
+ public void marshal(ITypeMarshalBuffer buffer, boolean includeValue) throws CoreException {
+ buffer.putShort(ITypeMarshalBuffer.EVAL_NARY_TYPE_ID);
+ buffer.putByte((byte) fOperator.ordinal());
+ buffer.putInt(fOperands.length);
+ for (IType operand : fOperands) {
+ buffer.marshalType(operand);
+ }
+ marshalTemplateDefinition(buffer);
+ }
+
+ public static ICPPEvaluation unmarshal(short firstBytes, ITypeMarshalBuffer buffer) throws CoreException {
+ int op = buffer.getByte();
+ int len = buffer.getInt();
+ IType[] operands = new IType[len];
+ for (int i = 0; i < len; i++) {
+ operands[i] = buffer.unmarshalType();
+ }
+ IBinding templateDefinition = buffer.unmarshalBinding();
+ return new EvalNaryTypeId(Operator.values()[op], operands, templateDefinition);
+ }
+}

Back to the top