private bool IsImageRequest(string document) { if ((document != null) && (document != String.Empty)) { Expression parsedExpression; CallExpression callExpression; Alphora.Dataphor.DAE.Language.D4.Parser parser = new Alphora.Dataphor.DAE.Language.D4.Parser(); parsedExpression = parser.ParseExpression(document); //check to see if its a qulifier expression first QualifierExpression qualifierExpression = parsedExpression as QualifierExpression; if (qualifierExpression != null) { if ((((IdentifierExpression)qualifierExpression.LeftExpression).Identifier) == "Frontend" || (((IdentifierExpression)qualifierExpression.LeftExpression).Identifier) == ".Frontend") { callExpression = qualifierExpression.RightExpression as CallExpression; } else { callExpression = parsedExpression as CallExpression; } } else { callExpression = parsedExpression as CallExpression; } return((callExpression != null) && (callExpression.Identifier == "Image")); } return(false); }
/// <inheritdoc /> protected override void DoSerialize(BuildXLWriter writer) { ModuleReference.Serialize(writer); QualifierExpression.Serialize(writer); writer.Write(SourceQualifierSpaceId); writer.Write(TargetQualifierSpaceId); }
/* * BNF: * <qualifier expression> ::= * <factor>[.<qualifier expression>] */ protected Expression QualifierExpression(Lexer lexer) { Expression localExpression = Factor(lexer); if (lexer.PeekTokenSymbol(1) == Keywords.Qualifier) { lexer.NextToken(); QualifierExpression qualifierExpression = new QualifierExpression(); qualifierExpression.SetPosition(lexer); qualifierExpression.LeftExpression = localExpression; qualifierExpression.RightExpression = QualifierExpression(lexer); return(qualifierExpression); } return(localExpression); }
public void NamespaceExpressionShouldCreateFullyQualifiedNameFromNamespaceExpressionAndNameString() { QualifierExpression ns1 = "namespace1"; ProductionExpression S = ns1 + "S", A = ns1 + "A"; S.Rule = A; A.Rule = 'a'; var symbolS = S.ProductionModel.LeftHandSide; Assert.IsNotNull(symbolS); Assert.AreEqual(ns1.Qualifier, symbolS.NonTerminal.QualifiedName.Qualifier); Assert.AreEqual(S.ProductionModel.LeftHandSide.NonTerminal.QualifiedName.Name, symbolS.NonTerminal.QualifiedName.Name); var symbolA = A.ProductionModel.LeftHandSide; Assert.IsNotNull(symbolA); Assert.AreEqual(ns1.Qualifier, symbolA.NonTerminal.QualifiedName.Qualifier); Assert.AreEqual(A.ProductionModel.LeftHandSide.NonTerminal.QualifiedName.Name, symbolA.NonTerminal.QualifiedName.Name); }
/* * BNF: * <qualified factor> ::= * (([.]<identifier>) | <qualifier expression>){"["<expression>"]"[.<qualifier expression>]} */ protected Expression QualifiedFactor(Lexer lexer) { Expression localExpression; if (lexer.PeekTokenSymbol(1) == Keywords.Qualifier) { lexer.NextToken(); localExpression = new IdentifierExpression(String.Format("{0}{1}", Keywords.Qualifier, Identifier(lexer))); } else { localExpression = QualifierExpression(lexer); } while (lexer.PeekTokenSymbol(1) == Keywords.BeginIndexer) { IndexerExpression indexerExpression = new IndexerExpression(); indexerExpression.SetPosition(lexer); indexerExpression.Expression = localExpression; lexer.NextToken(); indexerExpression.Indexer = Expression(lexer); lexer.NextToken().CheckSymbol(Keywords.EndIndexer); localExpression = indexerExpression; if (lexer.PeekTokenSymbol(1) == Keywords.Qualifier) { lexer.NextToken(); QualifierExpression qualifierExpression = new QualifierExpression(); qualifierExpression.SetPosition(lexer); qualifierExpression.LeftExpression = localExpression; qualifierExpression.RightExpression = QualifierExpression(lexer); localExpression = qualifierExpression; } } return(localExpression); }
/// <inheritdoc /> protected override EvaluationResult DoEval(Context context, ModuleLiteral env, EvaluationStackFrame frame) { // There is some code duplication between this type and the CoerceQualifierTypeExpression. // But there is not clear how to reuse this because steps are 'slightly' different. var moduleCandidate = ModuleReference.Eval(context, env, frame); if (moduleCandidate.IsErrorValue || moduleCandidate.IsUndefined) { return(moduleCandidate); } // The type checker should make sure that 'this expression' evaluates to a module literal. var module = moduleCandidate.Value as ModuleLiteral; Contract.Assert( module != null, I($"The left hand-side of a withQualifier expression should evaluates to 'TypeOrNamespaceModuleLiteral' but got '{moduleCandidate.Value.GetType()}'")); Contract.Assert(module.CurrentFileModule != null, "module.CurrentFileModule != null"); // QualifierExpression can be an object literal or anything that ended up as an object literal. EvaluationResult objectQualifier; using (var emptyFrame = EvaluationStackFrame.Empty()) { objectQualifier = QualifierExpression.Eval(context, env, emptyFrame); } if (objectQualifier.IsErrorValue) { // Error has been reported. return(EvaluationResult.Error); } var qualifierLiteral = objectQualifier.Value as ObjectLiteral; Contract.Assert( qualifierLiteral != null, I($"The right hand-side of a withQualifier expression should evaluates to 'ObjectLiteral' but got '{objectQualifier.Value.GetType()}'")); if (!QualifierValue.TryCreate(context, env, qualifierLiteral, out QualifierValue qualifierValue, qualifierLiteral.Location)) { // Error has been reported. return(EvaluationResult.Error); } // Coercing qualifier with a given value if ( !QualifierUtilities.CoerceQualifierValueForV2( context, qualifierValue, SourceQualifierSpaceId, TargetQualifierSpaceId, referencingLocation: Location.AsUniversalLocation(env, context), referencedLocation: module.CurrentFileModule.Location.AsUniversalLocation(module.CurrentFileModule, context), coercedQualifierValue: out QualifierValue coercedQualifierValue)) { // Error has been reported return(EvaluationResult.Error); } var result = module.Instantiate(context.ModuleRegistry, coercedQualifierValue); return(EvaluationResult.Create(result)); }
/// <inheritdoc /> public override string ToDebugString() { return(I($"{ModuleReference.ToDebugString()}.withQualifier({QualifierExpression.ToDebugString()})")); }
/// <inheritdoc /> protected override EvaluationResult DoEval(Context context, ModuleLiteral env, EvaluationStackFrame frame) { // There is some code duplication between this type and the CoerceQualifierTypeExpression. // But there is not clear how to reuse this because steps are 'slightly' different. var moduleCandidate = ModuleReference.Eval(context, env, frame); if (moduleCandidate.IsErrorValue || moduleCandidate.IsUndefined) { return(moduleCandidate); } // The type checker should make sure that 'this expression' evaluates to a module literal. var module = moduleCandidate.Value as ModuleLiteral; Contract.Assert( module != null, I($"The left hand-side of a withQualifier expression should evaluates to 'TypeOrNamespaceModuleLiteral' but got '{moduleCandidate.Value.GetType()}'")); Contract.Assert(module.CurrentFileModule != null, "module.CurrentFileModule != null"); var currentQualifier = env.CurrentFileModule.Qualifier.Qualifier; // QualifierExpression can be an object literal or anything that ended up as an object literal. EvaluationResult objectQualifier; using (var emptyFrame = EvaluationStackFrame.Empty()) { objectQualifier = QualifierExpression.Eval(context, env, emptyFrame); } if (objectQualifier.IsErrorValue) { // Error has been reported. return(EvaluationResult.Error); } var requestedQualifier = objectQualifier.Value as ObjectLiteral; Contract.Assert( requestedQualifier != null, I($"The right hand-side of a withQualifier expression should evaluates to 'ObjectLiteral' but got '{objectQualifier.Value.GetType()}'")); // TODO: This can be made more efficient by talking with the qualifier table directly // and maintaining a global map of qualifier id to object literal rather than have many copies of // object literal floating around, but that would be more changes than warranted at the moment // since withqualifier is not used that heavily at the moment, when this starts showing up on profiles // we should consider improving the logic here. var qualifierBindings = new Dictionary <StringId, Binding>(); foreach (var member in currentQualifier.Members) { qualifierBindings[member.Key] = new Binding(member.Key, member.Value, requestedQualifier.Location); } foreach (var member in requestedQualifier.Members) { if (member.Value.IsUndefined) { // setting a value to undefined implies explicitly removing they qualifier key. qualifierBindings.Remove(member.Key); } else { qualifierBindings[member.Key] = new Binding(member.Key, member.Value, requestedQualifier.Location); } } var qualifierToUse = ObjectLiteral.Create(qualifierBindings.Values.ToArray()); if (!QualifierValue.TryCreate(context, env, qualifierToUse, out QualifierValue qualifierValue, requestedQualifier.Location)) { // Error has been reported. return(EvaluationResult.Error); } // Coercing qualifier with a given value if ( !QualifierUtilities.CoerceQualifierValueForV2( context, qualifierValue, SourceQualifierSpaceId, TargetQualifierSpaceId, referencingLocation: Location.AsUniversalLocation(env, context), referencedLocation: module.CurrentFileModule.Location.AsUniversalLocation(module.CurrentFileModule, context), coercedQualifierValue: out QualifierValue coercedQualifierValue)) { // Error has been reported return(EvaluationResult.Error); } var result = module.Instantiate(context.ModuleRegistry, coercedQualifierValue); return(EvaluationResult.Create(result)); }