public override bool Visit(IPrimitiveExpression <ushort> expression, object context)
 {
     _stack.Push(expression);
     try
     {
         return(base.Visit(expression, context));
     }
     finally
     {
         _stack.Pop();
     }
 }
        public override bool Visit(IPrimitiveExpression <int> expression, object context)
        {
            /* Simple logic: The follow method predictions are all simple machines that follow a common routine.
             * The assignments are state, so the states will be different, but should be equivalent should the logical flow of all else be equivalent,
             * The ints that show up in the switches should be equivalent, unless we're actually returning what we should be doing, which needs to be the same.
             * If everything else, from a control-flow standpoint, is the same, the machines are equivalent in function.
             * A caveat: we do lose the parse tree context, from the comments, but in all honesty that is of little consequence. */
            var returnContext = this.ActiveContext.OfType <IReturnStatement>().FirstOrDefault();
            var switchContext = this.ActiveContext.OfType <ISwitchStatement>().FirstOrDefault();
            var assignContext = this.ActiveContext.OfType <IAssignmentExpression>().FirstOrDefault();

            if (returnContext == null && switchContext != null || assignContext != null)
            {
                return(true);
            }
            return(base.Visit(expression, context));
        }
Пример #3
0
 public void Dispose()
 {
     if (this.autoMember != null)
     {
         this.autoMember.Dispose();
         this.autoMember = null;
     }
     if (this.dataMember != null)
     {
         this.dataMember.Dispose();
         this.dataMember = null;
     }
     if (this.declarationTarget != null)
     {
         this.declarationTarget = null;
     }
     this.namePrimitive = null;
     this.name          = null;
     this.value         = null;
 }
Пример #4
0
        public void Rebuild()
        {
            if (this.autoMember != null)
            {
                this.declarationTarget.Properties.Remove(this.autoMember);
                this.autoMember.Dispose();
            }
            if (this.dataMember != null)
            {
                this.declarationTarget.Fields.Remove(this.dataMember);
                this.dataMember.Dispose();
            }
            switch (this.declarationTarget.GenerationType)
            {
            case ResourceGenerationType.GeneratedClass:
                this.autoMember             = declarationTarget.Properties.AddNew(new TypedName(name, typeof(string)), true, false);
                this.autoMember.AccessLevel = DeclarationAccessLevel.Internal;
                this.namePrimitive          = new PrimitiveExpression(name);
                this.autoMember.GetPart.Return(declarationTarget.ResourceManager.GetReference().GetMethod("GetString").Invoke(namePrimitive));
                break;

            case ResourceGenerationType.GeneratedClassWithCache:
                this.dataMember             = declarationTarget.Fields.AddNew(new TypedName(string.Format("__{0}_dm_", name), typeof(string)));
                this.autoMember             = declarationTarget.Properties.AddNew(new TypedName(name, typeof(string)), true, false);
                this.dataMember.IsStatic    = true;
                this.autoMember.IsStatic    = true;
                this.dataMember.AccessLevel = DeclarationAccessLevel.Private;
                this.autoMember.AccessLevel = DeclarationAccessLevel.Internal;
                IFieldReferenceExpression dataMemberReference = dataMember.GetReference();
                IConditionStatement       ics = this.autoMember.GetPart.IfThen((Expression.Expression)dataMemberReference == PrimitiveExpression.NullValue);
                this.namePrimitive = new PrimitiveExpression(name);
                ics.Assign(dataMemberReference, declarationTarget.ResourceManager.GetReference().GetMethod("GetString").Invoke(namePrimitive));
                this.autoMember.GetPart.Return(dataMemberReference);
                break;

            default:
                break;
            }
        }
Пример #5
0
 TransformationImpact IPrimitiveVisitor <TransformationImpact> .Visit(IPrimitiveExpression <ulong> primitive)
 {
     throw new NotImplementedException();
 }
Пример #6
0
 public abstract void TranslateExpression(IPrimitiveExpression primitiveExpression);
Пример #7
0
 public override void TranslateExpression(IPrimitiveExpression primitiveExpression)
 {
     this.Provider.GenerateCodeFromExpression(primitiveExpression.GenerateCodeDom(this.Options), base.Target, this.Options.Options);
 }
Пример #8
0
        /// <summary><para>Creates a C&#9839; compiler warning, relative to the abstract model, (level 4) &#35;78:</para><para>The 'l' suffix is easily confused with the digit '1' -- use 'L' for clarity</para></summary>
        /// <param name="expression">The <see cref="IPrimitiveExpression{T}"/> of type <see cref="UInt64"/>
        /// which contains the potentially confusing suffix.</param>
        public static ICompilerSourceModelWarning <IPrimitiveExpression <ulong> > WarningCS0078(IPrimitiveExpression <ulong> expression)
        {
            var start = expression.Start ?? LineColumnPair.Zero;
            var end   = expression.End ?? LineColumnPair.Zero;

            return(new CompilerSourceModelWarning <IPrimitiveExpression <ulong> >(CS0078, expression, expression.Location, start, end));
        }
Пример #9
0
 public abstract void Translate(IPrimitiveExpression <char> primitive);
Пример #10
0
 public abstract void Translate(IPrimitiveExpression <ulong> primitive);
Пример #11
0
        /// <summary>
        /// Parses the text in the specified PrimitiveExpression, collecting and returning a dictionary of FormatItems, indexed by the format item number.
        /// </summary>
        public static FormatItems GetFormatItems(IPrimitiveExpression primitiveExpression)
        {
            FormatItems formatItems = new FormatItems();
              formatItems.ParentMethodCall = GetValidMethodCallExpression(primitiveExpression.Parent) as IWithArguments;
              int argumentCount = formatItems.ParentMethodCall.Args.Count;
              formatItems.PrimitiveExpression = primitiveExpression;
              if (primitiveExpression == null)
            return formatItems;
              string text = primitiveExpression.Value as string;
              if (String.IsNullOrEmpty(text))
            return formatItems;
              bool lastCharWasOpenBrace = false;
              bool insideFormatItem = false;
              bool collectingFormatItemNumber = false;
              string numberStr = String.Empty;
              int lastOpenBraceOffset = 0;
              int length = 0;
              for (int i = 0; i < text.Length; i++)
              {
            char thisChar = text[i];
            if (thisChar == '{')
            {
              lastCharWasOpenBrace = !lastCharWasOpenBrace;
              lastOpenBraceOffset = i;
            }
            else if (thisChar == '}')
            {
              if (insideFormatItem)
              {
            insideFormatItem = false;
            if (numberStr != String.Empty)
            {
              int number = int.Parse(numberStr);
              const int INT_CountForBraceDelimeters = 2;
              int argumentIndex = number + 1;
              IExpression argument = null;
              if (argumentIndex < argumentCount)
                argument = formatItems.ParentMethodCall.Args[argumentIndex];

              if (!formatItems.HasFormatItem(number))
                formatItems.AddFormatItem(number, argument);
              formatItems[number].AddPosition(lastOpenBraceOffset, length + INT_CountForBraceDelimeters);
            }
              }
            }
            else if (lastCharWasOpenBrace)
            {
              length = 0;
              lastCharWasOpenBrace = false;
              insideFormatItem = true;
              collectingFormatItemNumber = true;
              numberStr = String.Empty;
              if (char.IsDigit(thisChar))
            numberStr = thisChar.ToString();		// First digit...
            }
            else if (collectingFormatItemNumber)
            {
              if (char.IsDigit(thisChar))
            numberStr += thisChar.ToString();		// Subsequent digit...
              else
            collectingFormatItemNumber = false;
            }
            length++;
              }
              return formatItems;
        }
Пример #12
0
 public abstract void Translate(IPrimitiveExpression <float> primitive);
Пример #13
0
 public abstract void Translate(IPrimitiveExpression <sbyte> primitive);
Пример #14
0
 public abstract void Translate(IPrimitiveExpression <decimal> primitive);
Пример #15
0
 void IPrimitiveVisitor.Visit(IPrimitiveExpression <double> primitive)
 {
     this.Translate(primitive);
 }
Пример #16
0
 public TestLinkerResult Visit(IPrimitiveExpression <decimal> expression, ICompilationContext context)
 {
     throw new NotImplementedException();
 }
Пример #17
0
 void IPrimitiveVisitor.Visit(IPrimitiveExpression <ulong> primitive)
 {
     this.Translate(primitive);
 }
Пример #18
0
 public TransformationKind Visit(IPrimitiveExpression <decimal> expression, ITransformationContext context)
 {
     return(TransformationKind.Ignore);
 }