public CodeBlock(Guid guid, CodeBlockType type, ProtoCore.Language langId, int cbID, SymbolTable symbols, ProcedureTable procTable, bool isBreakableBlock = false, ProtoCore.Core core = null)
        {
            this.guid = guid;
            blockType = type;

            parent   = null;
            children = new List <CodeBlock>();

            language    = langId;
            instrStream = new InstructionStream(langId, core);

            symbolTable    = symbols;
            procedureTable = procTable;

            isBreakable = isBreakableBlock;
            core.CompleteCodeBlockList.Add(this);
            this.codeBlockId = core.CompleteCodeBlockList.Count - 1;

            symbols.RuntimeIndex = this.codeBlockId;

            if (core.ProcNode != null)
            {
                core.ProcNode.ChildCodeBlocks.Add(codeBlockId);
            }
        }
Exemple #2
0
        private void ProcessCodeBlock(Match match, CodeBlockType blockType)
        {
            ProcessLiteral(match.Index);

            var code     = match.Groups["code"];
            var isEncode = match.Groups["encode"].Success;

            var startPos = code.Index;
            var endPos   = code.Index + code.Length;

            // trim whitespaces at the start
            while (startPos < endPos && char.IsWhiteSpace(text[startPos]))
            {
                ++startPos;
            }

            // trim whitespaces at the end
            while (startPos < endPos && char.IsWhiteSpace(text[endPos - 1]))
            {
                --endPos;
            }

            var codeText = text.Substring(startPos, endPos - startPos).Replace("%\\>", "%>");
            var location = CreateLocation(startPos, endPos);

            eventListener.OnCodeBlock(location, blockType, codeText, isEncode);

            if (blockType == CodeBlockType.Code)
            {
                ignoreNextSpaceString = true;
            }
        }
 protected CodeContainerComposite(CodeBlockType nodeType, int contexts, CEmmitableCodeContainer parent) : base(nodeType, parent)
 {
     m_repository = new List <CEmmitableCodeContainer> [contexts];
     for (int i = 0; i < contexts; i++)
     {
         m_repository[i] = new List <CEmmitableCodeContainer>();
     }
 }
 internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath)
 {
     this._content    = content;
     this._blockType  = blockType;
     this._column     = column;
     base.Line        = lineNumber;
     base.VirtualPath = virtualPath;
 }
 internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath)
 {
     this._content = content;
     this._blockType = blockType;
     this._column = column;
     base.Line = lineNumber;
     base.VirtualPath = virtualPath;
 }
 protected CComboContainer(CodeBlockType nodeType, CEmmitableCodeContainer parent, int numcontexts) : base(nodeType, parent)
 {
     m_repository = new List <CEmmitableCodeContainer> [numcontexts];
     for (int i = 0; i < numcontexts; i++)
     {
         m_repository[i] = new List <CEmmitableCodeContainer>();
     }
 }
Exemple #7
0
 internal CodeBlockBuilder(CodeBlockType blockType, string content,
                           int lineNumber, string sourceFileName)
 {
     _content        = content;
     _blockType      = blockType;
     _line           = lineNumber;
     _sourceFileName = sourceFileName;
 }
    internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath, bool encode) {
        _content = content;
        _blockType = blockType;
        _column = column;
        IsEncoded = encode;

        Line = lineNumber;
        VirtualPath = virtualPath;
    }
Exemple #9
0
 private static void Log(Status status, string message, CodeBlockType codeBlockType, ExceptionInfo exception)
 {
     Log(new LogEventInfo
     {
         Status        = status,
         Message       = message,
         CodeBlockType = codeBlockType,
         Exception     = exception
     });
 }
        internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath, bool encode)
        {
            _content   = content;
            _blockType = blockType;
            _column    = column;
            IsEncoded  = encode;

            Line        = lineNumber;
            VirtualPath = virtualPath;
        }
        /// <summary>
        /// Clears generated blocks and reverts code iteration progress to initial state.
        /// Unformatted code will NOT be cleared (Use SetCode("") for that).
        /// </summary>
        public void Clear()
        {
            generatedBlocks.Clear();

            index             = 0;
            nextIndex         = 1;
            currentBlockStart = 0;
            isEscapeSequence  = false;
            currentType       = CodeBlockType.Default;
            lineCount         = 0;
        }
Exemple #12
0
        protected virtual void AddCodeBlock(Match match, CodeBlockType type, string text)
        {
            ProcessLiteral();

            Group  group      = match.Groups["code"];
            string s          = group.Value.Replace(@"%\>", "%>");
            int    lineNumber = _lineNumber;

            if (type != CodeBlockType.Code)
            {
                int length = -1;
                for (int i = 0; (i < s.Length && Char.IsWhiteSpace(s[i])); ++i)
                {
                    if ((s[i] == '\r' || s[i] == '\n') &&
                        (i == 0 || s[i - 1] != '\r'))
                    {
                        lineNumber++;
                        length = i;
                    }
                    else if (s[i] == '\n')
                    {
                        length = i;
                    }
                }

                if (length >= 0)
                {
                    s = s.Substring(length + 1);
                }

                length = -1;
                for (int j = s.Length - 1; j >= 0 && Char.IsWhiteSpace(s[j]); j--)
                {
                    if (s[j] == '\r' || s[j] == '\n')
                    {
                        length = j;
                    }
                }

                if (length >= 0)
                {
                    s = s.Substring(0, length);
                }

                if (IsWhiteSpaceString(s))
                {
                    throw Error.EmptyCodeRenderExpression(_virtualPath, text, _lineNumber + 1);
                }
            }
            Expressions.Add(new CodeBlockExpression(type, s));
        }
Exemple #13
0
        public CodeBlock(CodeBlockType type, ProtoCore.Language langId, int codeBlockId, SymbolTable symbols, ProcedureTable procTable, bool isBreakableBlock = false, ProtoLanguage.CompileStateTracker compileState = null)
        {
            blockType = type;

            parent   = null;
            children = new List <CodeBlock>();

            language         = langId;
            this.codeBlockId = codeBlockId;
            instrStream      = new InstructionStream(langId, compileState);

            symbolTable    = symbols;
            procedureTable = procTable;

            isBreakable = isBreakableBlock;
        }
Exemple #14
0
        public CodeBlock(CodeBlockType type, ProtoCore.Language langId, int codeBlockId, SymbolTable symbols, ProcedureTable procTable, bool isBreakableBlock = false, ProtoCore.Core core = null)
        {
            blockType = type;

            parent = null;
            children = new List<CodeBlock>();

            language = langId;
            this.codeBlockId = codeBlockId;
            instrStream = new InstructionStream(langId, core);

            symbolTable = symbols;
            procedureTable = procTable;

            isBreakable = isBreakableBlock;
        }
        /// <summary> Ends current block at current index and adds it to generatedBlocks. </summary>
        protected void EndBlock()
        {
            int blockLength = index - currentBlockStart;

            if (blockLength == 0)
            {
                return;
            }

            if (currentBlockStart < 0 || blockLength < 0 || index > length)
            {
                if (index < 0)
                {
                    UnityEngine.Debug.LogError("EndBlock(" + currentType + ") - blockStart=" + currentBlockStart + ", blockLength=" + blockLength + ", index=" + index + ", length=" + length + " with generatedBlocks:\n" + generatedBlocks);
                    return;
                }

                UnityEngine.Debug.LogError("EndBlock(" + currentType + ") - blockStart=" + currentBlockStart + ", blockLength=" + blockLength + ", index=" + index + ", length=" + length + " with generatedBlocks:\n" + generatedBlocks);

                while (index >= length)
                {
                    index--;
                }
                if (index <= currentBlockStart)
                {
                    return;
                }
            }

                        #if DEV_MODE && DEBUG_ENABLED
            UnityEngine.Debug.Log("EndBlock(" + currentType + ") - blockStart=" + currentBlockStart + ", blockLength=" + blockLength + ", index=" + index + ", length=" + length + " with block: \"" + codeUnformatted.Substring(currentBlockStart, blockLength) + "\"");
                        #endif

            generatedBlocks.Add(new CodeBlock(textUnformatted.Substring(currentBlockStart, blockLength), currentType));
            currentBlockStart = index;
            currentType       = CodeBlockType.Default;
        }
Exemple #16
0
        void IParserEventListener.OnCodeBlock(Location location, CodeBlockType blockType, string code, bool isEncode)
        {
            switch (blockType)
            {
            case CodeBlockType.Code:
                currentNode.AddChild(new AspxNode.CodeRender(code, location));
                break;

            case CodeBlockType.Expression:
                currentNode.AddChild(new AspxNode.CodeRenderExpression(code, location));
                break;

            case CodeBlockType.DataBinding:
                currentNode.AddChild(new AspxNode.DataBinding(code, location));
                break;

            case CodeBlockType.EncodedExpression:
                currentNode.AddChild(new AspxNode.CodeRenderEncode(code, location));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(blockType), blockType, null);
            }
        }
Exemple #17
0
 public static void Pass(string message, CodeBlockType codeBlockType = CodeBlockType.None)
 {
     Log(Status.Pass, message, codeBlockType, null);
 }
Exemple #18
0
 public static void Warning(string message, CodeBlockType codeBlockType = CodeBlockType.None, ExceptionInfo exception = null)
 {
     Log(Status.Warning, message, codeBlockType, exception);
 }
 internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath)
     : this(blockType, content, lineNumber, column, virtualPath, false) {
 }
 public CForStatement(CodeBlockType nodeType, int contexts, CEmmitableCodeContainer parent) : base(nodeType, contexts, parent)
 {
 }
 public CCFunctionDefinition(CodeBlockType nodeType, int contexts, CEmmitableCodeContainer parent) : base(nodeType, contexts, parent)
 {
 }
		public CodeBlockExpression(CodeBlockType type, string code)
			: base(TemplateExpressionType.CodeBlock)
		{
			_blockType = type;
			_code = code;
		}
 public CFile(CodeBlockType nodeType, int contexts, CEmmitableCodeContainer parent) : base(nodeType, contexts, parent)
 {
     m_mainFunctionDefinition = new CMainFunctionDefinition(this);
     AddCode(m_mainFunctionDefinition, CFile.CB_FUNDEFS);
 }
Exemple #24
0
 public static void Info(string message, CodeBlockType codeBlockType = CodeBlockType.None)
 {
     Log(Status.Info, message, codeBlockType, null);
 }
 internal CodeBlockBuilder(CodeBlockType blockType, string content, int lineNumber, int column, VirtualPath virtualPath)
     : this(blockType, content, lineNumber, column, virtualPath, false)
 {
 }
Exemple #26
0
    /*
     *  Handle <%= ... %>, <%# ... %> and <% ... %> blocks
     */
    private void ProcessCodeBlock(Match match, CodeBlockType blockType, string text) {

        // Take care of the previous literal string
        ProcessLiteral();

        // Get the piece of code
        Group codeGroup = match.Groups["code"];
        string code = codeGroup.Value;

        bool encode = match.Groups["encode"].Success;

        // Replace "%\>" with "%>" (ASURT 7175)
        code = code.Replace(@"%\>", "%>");

        int lineNumber = _lineNumber;
        int column = -1;

        if (blockType != CodeBlockType.Code) {

            // It a <%= %>, <%# %> or <%: %> block.  We need to do special handling of newline chars

            // If there are newlines in the beginning of the code string we need to get rid of them,
            // and adjust the line pragma accordingly.  This is needed because some compilers (like VB)
            // don't support multiline expression (ASURT 13662)
            int newlineIndex = -1;
            for (int i = 0; i < code.Length && Char.IsWhiteSpace(code[i]); i++) {
                if (code[i] == '\r' || (code[i] == '\n' && (i == 0 || code[i - 1] != '\r'))) {
                    lineNumber++;
                    newlineIndex = i;
                }
                else if (code[i] == '\n') {
                    newlineIndex = i;
                }
            }

            if (newlineIndex >= 0) {
                // If we found some newlines in the beginning, get rid of them.  Note
                // that we preserve the spaces, to get correct column information
                code = code.Substring(newlineIndex + 1);

                // The code starts at column 1 (since we keep the spaces)
                column = 1;
            }

            // Same deal for the end of the string: look for the first newline
            // after the last non-blank chararacter
            newlineIndex = -1;
            for (int i = code.Length - 1; i >= 0 && Char.IsWhiteSpace(code[i]); i--) {
                if (code[i] == '\r' || code[i] == '\n')
                    newlineIndex = i;
            }

            // And if we found one, remove it and everything after
            if (newlineIndex >= 0)
                code = code.Substring(0, newlineIndex);

            // Disallow empty expressions (ASURT 40124)
            // Do not treat as error in CBM. This is necessary so we still generate
            // code blocks for empty expressions. (VSWhidbey 406212)
            if (!IgnoreParseErrors && Util.IsWhiteSpaceString(code)) {
                ProcessError(SR.GetString(SR.Empty_expression));

                return;
            }
        }

        if (column < 0) {

            // It a <% %> block.  Newline chars are not a problem.

            // Look for the last newline before the code string
            int newlineIndex = text.LastIndexOfAny(s_newlineChars, codeGroup.Index-1);

            // Use it to calculate the column where the code starts,
            // which improves the debugging experience (VSWhidbey 87172)
            column = codeGroup.Index-newlineIndex;
            Debug.Assert(column > 0);
        }

        ControlBuilder builder = ((BuilderStackEntry) BuilderStack.Peek())._builder;
        ControlBuilder subBuilder;

        // First, give the PageParserFilter a chance to handle the code block
        if (!PageParserFilterProcessedCodeBlock(CodeConstructTypeFromCodeBlockType(blockType), code, lineNumber)) {

            // Make sure it's legal to have code in this page
            EnsureCodeAllowed();

            // Add the code block to the top builder
            subBuilder = new CodeBlockBuilder(blockType, code, lineNumber, column, CurrentVirtualPath, encode);

            AppendSubBuilder(builder, subBuilder);

            // Optionally record code block position data
            ParseRecorders.RecordCodeBlock(subBuilder, match);
        }

        // Always ignore the spaces after a <% ... %> block
        if (blockType == CodeBlockType.Code)
            flags[ignoreNextSpaceString] = true;
    }
Exemple #27
0
        /// <summary>
        /// A CodeBlock represents a body of DS code
        /// </summary>
        /// <param name="guid"></param>
        /// <param name="type"></param>
        /// <param name="langId"></param>
        /// <param name="cbID"></param>
        /// <param name="symbols"></param>
        /// <param name="procTable"></param>
        /// <param name="isBreakableBlock"></param>
        /// <param name="core"></param>
        public CodeBlock(Guid guid, CodeBlockType type, ProtoCore.Language langId, int cbID, SymbolTable symbols, ProcedureTable procTable, bool isBreakableBlock = false, ProtoCore.Core core = null)
        {
            this.guid = guid;
            blockType = type;

            parent = null;
            children = new List<CodeBlock>();

            language = langId;
            instrStream = new InstructionStream(langId, core);

            symbolTable = symbols;
            procedureTable = procTable;

            isBreakable = isBreakableBlock;
            core.CompleteCodeBlockList.Add(this);
            this.codeBlockId = core.CompleteCodeBlockList.Count - 1;

            symbols.RuntimeIndex = this.codeBlockId;

            if (core.ProcNode != null)
            {
                core.ProcNode.ChildCodeBlocks.Add(codeBlockId);
            }
        }
        /// <summary>
        /// Moves to inspect the next character in the unformatted code
        /// and detects changes to the current CodeBlock. When a new code
        /// block is discovered, the previous one is added to the codeBlockGroup. </summary>
        /// <returns> False if end of code was reached, true if not. </returns>
        public virtual bool ReadNextCharForCodeBlock()
        {
            if (index >= length)
            {
                EndBlock();
                return(false);
            }

            currentChar = textUnformatted[index];

            int charCount;

            switch (currentType)
            {
            case CodeBlockType.CommentBlock:
                if (IsCommentBlockEnd())
                {
                    AddToIndex(2);
                    EndBlock();
                    break;
                }
                charCount = IsLineEnd();
                if (charCount != -1)
                {
                    LineBreak(charCount);
                    break;
                }
                NextIndex();
                break;

            //both comment line and preprocessor directive
            //are effective until next line break
            case CodeBlockType.CommentLine:
            case CodeBlockType.PreprocessorDirective:
                charCount = IsLineEnd();
                if (charCount != -1)
                {
                    EndBlock();
                    LineBreak(charCount);
                    break;
                }
                NextIndex();
                break;

            case CodeBlockType.String:
                if (IsStringEnd())
                {
                    NextIndex();
                    EndBlock();
                    isEscapeSequence = false;
                    break;
                }

                if (IsEscapeSequence())
                {
                    isEscapeSequence = true;
                    NextIndex();
                    break;
                }
                isEscapeSequence = false;

                //if this happens the MonoScript should have a compile error
                //but still it could happen
                charCount = IsLineEnd();
                if (charCount != -1)
                {
                    EndBlock();                             //reset the type since it's an error, to prevent possibly all the rest of the code being syntax highlighted as a string
                    LineBreak(charCount);
                    break;
                }

                NextIndex();
                break;

            case CodeBlockType.Char:
                if (IsCharEnd())
                {
                    NextIndex();
                    EndBlock();
                    isEscapeSequence = false;
                    break;
                }

                if (IsEscapeSequence())
                {
                    isEscapeSequence = true;
                    NextIndex();
                    break;
                }
                isEscapeSequence = false;

                //if this happens it's an error
                //but still it could happen
                charCount = IsLineEnd();
                if (charCount != -1)
                {
                    LineBreak(charCount);
                    break;
                }
                NextIndex();
                break;

            case CodeBlockType.Type:                     //List, MyClass
            case CodeBlockType.Keyword:                  //ref, class, string...
                charCount = IsWhiteSpace();
                if (charCount != -1)
                {
                    EndBlock();
                    if (IsLineEnd() != -1)
                    {
                        LineBreak(charCount);
                    }
                    break;
                }

                if (IsSpecialCharacter())
                {
                    EndBlock();
                    NextIndex();
                    break;
                }

                NextIndex();
                break;

            case CodeBlockType.Number:
                if (IsNumber())
                {
                    NextIndex();
                    break;
                }
                EndBlock();
                currentType = CodeBlockType.Default;
                break;

            default:
                if (IsCommentBlockStart())
                {
                    EndBlock();
                    AddToIndex(2);
                    currentType = CodeBlockType.CommentBlock;
                    break;
                }
                if (IsCommentLineStart())
                {
                    EndBlock();
                    AddToIndex(2);
                    currentType = CodeBlockType.CommentLine;
                    break;
                }
                if (IsStringStart())
                {
                    EndBlock();
                    NextIndex();
                    currentType = CodeBlockType.String;
                    break;
                }
                if (IsCharStart())
                {
                    EndBlock();
                    NextIndex();
                    currentType = CodeBlockType.Char;
                    break;
                }
                if (IsPreprocessorDirectiveStart())
                {
                    EndBlock();
                    NextIndex();
                    currentType = CodeBlockType.PreprocessorDirective;
                    break;
                }
                charCount = IsLineEnd();
                if (charCount != -1)
                {
                    LineBreak(charCount);
                    break;
                }
                charCount = IsKeyword();
                if (charCount != -1)
                {
                    EndBlock();
                    AddToIndex(charCount);
                    currentType = CodeBlockType.Keyword;
                    EndBlock();
                    break;
                }
                charCount = IsType();
                if (charCount != -1)
                {
                    if (index + charCount > length)
                    {
                        UnityEngine.Debug.LogError("IsType returned charCount " + charCount + " but index " + index + " + charCount was more than length " + length);
                        NextIndex();
                        break;
                    }
                    EndBlock();
                    AddToIndex(charCount);
                    currentType = CodeBlockType.Type;
                    EndBlock();
                    break;
                }
                if (IsNumber())
                {
                    EndBlock();
                    currentType = CodeBlockType.Number;
                    NextIndex();
                    break;
                }

                NextIndex();
                break;
            }
            return(true);
        }
Exemple #29
0
 public CodeBlock(string content, CodeBlockType type)
 {
     this.type    = type;
     this.content = content;
 }
 public CodeContainer(CodeBlockType nodeType, CEmmitableCodeContainer parent) : base(nodeType, parent)
 {
 }
Exemple #31
0
 // Map a CodeBlockType to the equivalent CodeConstructType
 private static CodeConstructType CodeConstructTypeFromCodeBlockType(CodeBlockType blockType) {
     switch (blockType) {
         case CodeBlockType.Code:
             return CodeConstructType.CodeSnippet;
         case CodeBlockType.Expression:
             return CodeConstructType.ExpressionSnippet;
         case CodeBlockType.EncodedExpression:
             return CodeConstructType.EncodedExpressionSnippet;
         case CodeBlockType.DataBinding:
             return CodeConstructType.DataBindingSnippet;
         default:
             Debug.Assert(false);
             return CodeConstructType.CodeSnippet;
     }
 }
Exemple #32
0
 public CodeBlock(Instruction first, Instruction last, CodeBlockType type = CodeBlockType.Unknown)
 {
     this.first = first;
     this.last  = last;
     this.type  = type;
 }
 public CodeBlockExpression(CodeBlockType type, string code)
     : base(TemplateExpressionType.CodeBlock)
 {
     _blockType = type;
     _code      = code;
 }
		protected virtual void AddCodeBlock(Match match, CodeBlockType type, string text)
		{
			ProcessLiteral();

			Group group = match.Groups["code"];
			string s = group.Value.Replace(@"%\>", "%>");
			int lineNumber = _lineNumber;
			
			if (type != CodeBlockType.Code)
			{
				int length = -1;
				for (int i = 0; (i < s.Length && Char.IsWhiteSpace(s[i])); ++i)
				{
					if ((s[i] == '\r' || s[i] == '\n') && 
						(i == 0 || s[i - 1] != '\r'))
					{
						lineNumber++;
						length = i;
					}
					else if (s[i] == '\n')
						length = i;
				}

				if (length >= 0)
					s = s.Substring(length + 1);
				
				length = -1;
				for (int j = s.Length - 1; j >= 0 && Char.IsWhiteSpace(s[j]); j--)
				{
					if (s[j] == '\r' || s[j] == '\n')
						length = j;
				}
				
				if (length >= 0)
					s = s.Substring(0, length);

				if (IsWhiteSpaceString(s))
					throw Error.EmptyCodeRenderExpression(_virtualPath, text, _lineNumber + 1);
			}
			Expressions.Add(new CodeBlockExpression(type, s));
		}