コード例 #1
0
ファイル: ASFileParser.cs プロジェクト: heon21st/flashdevelop
		static public FileModel ParseFile(FileModel fileModel)
        {
            string src = "";
            // parse file
            if (fileModel.FileName.Length > 0)
            {
                if (File.Exists(fileModel.FileName))
                {
                    src = PluginCore.Helpers.FileHelper.ReadFile(fileModel.FileName);
                    ASFileParser parser = new ASFileParser();
                    fileModel.LastWriteTime = File.GetLastWriteTime(fileModel.FileName);
                    if (cachedPath != null)
                        cacheLastWriteTime = fileModel.LastWriteTime;
                    parser.ParseSrc(fileModel, src);
                }
                // the file is not available (for the moment?)
                else if (Path.GetExtension(fileModel.FileName).Length > 0)
                {
                    fileModel.OutOfDate = true;
                }
            }
            // this is a package
            else
            {
                // ignore
            }
            return fileModel;
        }
コード例 #2
0
 public void ParseFile_SimpleClass()
 {
     using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.as3.SimpleClassTest.as"))
     {
         var srcModel = new FileModel(resourceFile.DestinationFile);
         srcModel.Context = new AS3Context.Context();
         var model = ASFileParser.ParseFile(srcModel);
         Assert.AreEqual(3, model.Version);
         Assert.IsTrue(model.HasPackage);
         Assert.AreEqual("test.test", model.Package);
         Assert.AreEqual(1, model.Classes.Count);
         var classModel = model.Classes[0];
         Assert.AreEqual("Test", classModel.Name);
         Assert.AreEqual("test.test.Test", classModel.QualifiedName);
         Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
         Assert.AreEqual(Visibility.Public, classModel.Access & Visibility.Public);
         Assert.AreEqual(2, classModel.LineFrom);
         Assert.AreEqual(7, classModel.LineTo);
         Assert.AreEqual(1, classModel.Members.Count);
         var memberModel = classModel.Members[0];
         Assert.AreEqual("Test", memberModel.Name);
         Assert.AreEqual(FlagType.Function, memberModel.Flags & FlagType.Function);
         Assert.AreEqual(FlagType.Constructor, memberModel.Flags & FlagType.Constructor);
         Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
         Assert.AreEqual(4, memberModel.LineFrom);
         Assert.AreEqual(6, memberModel.LineTo);
     }
 }
コード例 #3
0
            public void ParseFile_IdentifiersWithUnicodeChars()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.as3.IdentifiersWithUnicodeCharsTest.as"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new AS3Context.Context(new AS3Context.AS3Settings());
                    var model = ASFileParser.ParseFile(srcModel);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.LineFrom);
                    Assert.AreEqual(9, classModel.LineTo);
                    Assert.AreEqual(2, classModel.Members.Count);

                    var memberModel = classModel.Members[0];
                    Assert.AreEqual("thísIsVälid", memberModel.Name);
                    Assert.AreEqual("String", memberModel.Type);
                    Assert.AreEqual(FlagType.Function, memberModel.Flags & FlagType.Function);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(4, memberModel.LineFrom);
                    Assert.AreEqual(6, memberModel.LineTo);

                    memberModel = classModel.Members[1];
                    Assert.AreEqual("日本語文字ヴァリアブル", memberModel.Name);
                    Assert.AreEqual("Dynamic", memberModel.Type);
                    Assert.AreEqual(FlagType.Variable, memberModel.Flags & FlagType.Variable);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(8, memberModel.LineFrom);
                    Assert.AreEqual(8, memberModel.LineTo);
                }
            }
コード例 #4
0
 public void ParseFile_OverrideFunction()
 {
     using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.as3.OverrideFunctionTest.as"))
     {
         var srcModel = new FileModel(resourceFile.DestinationFile);
         srcModel.Context = new AS3Context.Context();
         var model = ASFileParser.ParseFile(srcModel);
         var classModel = model.Classes[0];
         Assert.AreEqual(2, classModel.Members.Count);
         var memberModel = classModel.Members[0];
         Assert.AreEqual("test1", memberModel.Name);
         var expectedFlags = FlagType.Function | FlagType.Override;
         Assert.AreEqual(expectedFlags, memberModel.Flags & expectedFlags);
         Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
         Assert.AreEqual(4, memberModel.LineFrom);
         Assert.AreEqual(7, memberModel.LineTo);
         memberModel = classModel.Members[1];
         Assert.AreEqual("test2", memberModel.Name);
         Assert.AreEqual(expectedFlags, memberModel.Flags & expectedFlags);
         Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
         Assert.AreEqual(9, memberModel.LineFrom);
         Assert.AreEqual(12, memberModel.LineTo);
     }
 }
コード例 #5
0
ファイル: ASGenerator.cs プロジェクト: zaynyatyi/flashdevelop
        private static MemberModel ResolveDelegate(string type, FileModel inFile)
        {
            foreach (MemberModel def in inFile.Members)
                if (def.Name == type && (def.Flags & FlagType.Delegate) > 0)
                    return def;

            if (type.IndexOf('.') < 0)
            {
                string dotType = '.' + type;
                MemberList imports = ASContext.Context.ResolveImports(inFile);
                foreach (MemberModel import in imports)
                    if (import.Type.EndsWith(dotType))
                    {
                        type = import.Type;
                        break;
                    }
            }

            MemberList known = ASContext.Context.GetAllProjectClasses();
            foreach (MemberModel def in known)
                if (def.Type == type && (def.Flags & FlagType.Delegate) > 0)
                    return def;
            return null;
        }
コード例 #6
0
ファイル: ASGenerator.cs プロジェクト: zaynyatyi/flashdevelop
        private static void GenerateVariableJob(GeneratorJobType job, ScintillaNet.ScintillaControl Sci, MemberModel member,
            bool detach, ClassModel inClass)
        {
            int position = 0;
            MemberModel latest = null;
            bool isOtherClass = false;

            Visibility varVisi = job.Equals(GeneratorJobType.Variable) ? GetDefaultVisibility() : Visibility.Public;
            FlagType ft = job.Equals(GeneratorJobType.Constant) ? FlagType.Constant : FlagType.Variable;

            // evaluate, if the variable (or constant) should be generated in other class
            ASResult varResult = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(Sci.CurrentPos, true));

            int contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(Sci.CurrentPos, true));
            MemberModel isStatic = new MemberModel();
            if (contextOwnerPos != -1)
            {
                ASResult contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos);
                if (contextOwnerResult != null)
                {
                    if (contextOwnerResult.Member == null && contextOwnerResult.Type != null)
                    {
                        isStatic.Flags |= FlagType.Static;
                    }
                }
            }
            else if (member != null && (member.Flags & FlagType.Static) > 0)
            {
                isStatic.Flags |= FlagType.Static;
            }

            ASResult returnType = null;
            int lineNum = Sci.CurrentLine;
            string line = Sci.GetLine(lineNum);
            
            Match m = Regex.Match(line, "\\b" + Regex.Escape(contextToken) + "\\(");
            if (m.Success)
            {
                returnType = new ASResult();
                returnType.Type = ASContext.Context.ResolveType("Function", null);
            }
            else
            {
                m = Regex.Match(line, @"=\s*[^;\n\r}}]+");
                if (m.Success)
                {
                    int posLineStart = Sci.PositionFromLine(lineNum);
                    if (posLineStart + m.Index >= Sci.CurrentPos)
                    {
                        line = line.Substring(m.Index);
                        StatementReturnType rType = GetStatementReturnType(Sci, inClass, line, posLineStart + m.Index);
                        if (rType != null)
                        {
                            returnType = rType.resolve;
                        }
                    }
                }
            }

            if (varResult.RelClass != null && !varResult.RelClass.IsVoid() && !varResult.RelClass.Equals(inClass))
            {
                AddLookupPosition();
                lookupPosition = -1;

                ASContext.MainForm.OpenEditableDocument(varResult.RelClass.InFile.FileName, false);
                Sci = ASContext.CurSciControl;
                isOtherClass = true;

                FileModel fileModel = new FileModel();
                fileModel.Context = ASContext.Context;
                ASFileParser parser = new ASFileParser();
                parser.ParseSrc(fileModel, Sci.Text);

                foreach (ClassModel cm in fileModel.Classes)
                {
                    if (cm.QualifiedName.Equals(varResult.RelClass.QualifiedName))
                    {
                        varResult.RelClass = cm;
                        break;
                    }
                }
                inClass = varResult.RelClass;

                ASContext.Context.UpdateContext(inClass.LineFrom);
            }

            latest = GetLatestMemberForVariable(job, inClass, varVisi, isStatic);
            
            // if we generate variable in current class..
            if (!isOtherClass && member == null)
            {
                detach = false;
                lookupPosition = -1;
                position = Sci.WordStartPosition(Sci.CurrentPos, true);
                Sci.SetSel(position, Sci.WordEndPosition(position, true));
            }
            else // if we generate variable in another class
            {
                if (latest != null)
                {
                    position = FindNewVarPosition(Sci, inClass, latest);
                }
                else
                {
                    position = GetBodyStart(inClass.LineFrom, inClass.LineTo, Sci);
                    detach = false;
                }
                if (position <= 0) return;
                Sci.SetSel(position, position);
            }

            // if this is a constant, we assign a value to constant
            string returnTypeStr = null;
            string eventValue = null;
            if (job == GeneratorJobType.Constant && returnType == null)
            {
                isStatic.Flags |= FlagType.Static;
                eventValue = "String = \"" + Camelize(contextToken) + "\"";
            }
            else if (returnType != null)
            {
                ClassModel inClassForImport = null;
                if (returnType.InClass != null)
                {
                    inClassForImport = returnType.InClass;
                }
                else if (returnType.RelClass != null)
                {
                    inClassForImport = returnType.RelClass;
                }
                else
                {
                    inClassForImport = inClass;
                }
                List<String> imports = new List<string>();
                if (returnType.Member != null)
                {
                    if (returnType.Member.Type != ASContext.Context.Features.voidKey)
                    {
                        returnTypeStr = FormatType(GetShortType(returnType.Member.Type));
                        imports.Add(getQualifiedType(returnType.Member.Type, inClassForImport));
                    }
                }
                else if (returnType != null && returnType.Type != null)
                {
                    returnTypeStr = FormatType(GetShortType(returnType.Type.QualifiedName));
                    imports.Add(getQualifiedType(returnType.Type.QualifiedName, inClassForImport));
                }
                if (imports.Count > 0)
                {
                    position += AddImportsByName(imports, Sci.LineFromPosition(position));
                    Sci.SetSel(position, position);
                }
            }
            MemberModel newMember = NewMember(contextToken, isStatic, ft, varVisi);
            if (returnTypeStr != null)
            {
                newMember.Type = returnTypeStr;
            }
            else if (eventValue != null)
            {
                newMember.Type = eventValue;
            }
            GenerateVariable(newMember, position, detach);
        }
コード例 #7
0
ファイル: ASFileParser.cs プロジェクト: thecocce/flashdevelop
        public void ParseSrc(FileModel fileModel, string ba, bool allowBaReExtract)
        {
            //TraceManager.Add("Parsing " + Path.GetFileName(fileModel.FileName));
            model = fileModel;
            model.OutOfDate = false;
            model.CachedModel = false;
            if (model.Context != null) features = model.Context.Features;
            if (features != null && features.hasModules)
                model.Module = Path.GetFileNameWithoutExtension(model.FileName);

            // pre-filtering
            if (allowBaReExtract && model.HasFiltering && model.Context != null)
                ba = model.Context.FilterSource(fileModel.FileName, ba);

            model.InlinedIn = null;
            model.InlinedRanges = null;

            // language features
            model.Imports.Clear();
            model.Classes.Clear();
            model.Members.Clear();
            model.Namespaces.Clear();
            model.Regions.Clear();
            model.PrivateSectionIndex = 0;
            model.Package = "";
            model.MetaDatas = null;

            // state
            int len = ba.Length;
            if (len < 0)
                return;
            int i = 0;
            line = 0;

            // when parsing cache file including multiple files
            resetParser:

            char c1;
            char c2;
            int matching = 0;
            bool isInString = false;
            int inString = 0;
            int braceCount = 0;
            bool inCode = true;

            // comments
            char[] commentBuffer = new char[COMMENTS_BUFFER];
            int commentLength = 0;
            lastComment = null;
            curComment = null;

            // tokenisation
            tryPackage = true;
            hasPackageSection = false;
            haXe = model.haXe;
            TypeCommentUtils.ObjectType = haXe ? "Dynamic" : "Object";
            version = (haXe) ? 4 : 1;
            curToken = new Token();
            prevToken = new Token();
            int tokPos = 0;
            int tokLine = 0;
            curMethod = null;
            curMember = null;
            valueKeyword = null;
            valueMember = null;
            curModifiers = 0;
            curNamespace = "internal";
            curAccess = 0;

            char[] buffer = new char[TOKEN_BUFFER];
            int length = 0;
            char[] valueBuffer = new char[VALUE_BUFFER];
            int valueLength = 0;
            int paramBraceCount = 0;
            int paramTempCount = 0;
            int paramParCount = 0;
            int paramSqCount = 0;

            bool hadWS = true;
            bool hadDot = false;
            inParams = false;
            inEnum = false;
            inTypedef = false;
            inAbstract = false;
            inValue = false;
            inConst = false;
            inType = false;
            inGeneric = false;
            inAnonType = false;

            bool addChar = false;
            int evalToken = 0;
            //bool evalKeyword = true;
            context = 0;
            modifiers = 0;
            foundColon = false;

            bool handleDirectives = features.hasDirectives || cachedPath != null;
            bool inlineDirective = false;

            while (i < len)
            {
                c1 = ba[i++];
                isInString = (inString > 0);

                /* MATCH COMMENTS / STRING LITERALS */

                switch (matching)
                {
                    // look for comment block/line and preprocessor commands
                    case 0:
                        if (!isInString)
                        {
                            // new comment
                            if (c1 == '/' && i < len)
                            {
                                c2 = ba[i];
                                if (c2 == '/')
                                {
                                    // Check if this this is a /// comment
                                    if (i + 1 < len && ba[i + 1] == '/')
                                    {
                                        // This is a /// comment
                                        matching = 4;
                                        isBlockComment = true;
                                        i++;
                                    }
                                    else
                                    {
                                        // This is a regular comment
                                        matching = 1;
                                        isBlockComment = false;
                                    }
                                    inCode = false;
                                    i++;
                                    continue;
                                }
                                else if (c2 == '*')
                                {
                                    isBlockComment = (i + 1 < len && ba[i + 1] == '*');
                                    matching = 2;
                                    inCode = false;
                                    i++;
                                    while (i < len - 1)
                                    {
                                        c2 = ba[i];
                                        if (c2 == '*' && ba[i + 1] != '/') i++;
                                        else break;
                                    }
                                    continue;
                                }
                            }
                            // don't look for comments in strings
                            else if (c1 == '"')
                            {
                                isInString = true;
                                inString = 1;
                            }
                            else if (c1 == '\'')
                            {
                                isInString = true;
                                inString = 2;
                            }
                            // preprocessor statements
                            else if (c1 == '#' && handleDirectives)
                            {
                                int ls = i - 2;
                                inlineDirective = false;
                                while (ls > 0)
                                {
                                    c2 = ba[ls--];
                                    if (c2 == 10 || c2 == 13) break;
                                    else if (c2 > 32) { inlineDirective = true; break; }
                                }
                                c2 = ba[i];
                                if (i < 2 || ba[i - 2] < 33 && c2 >= 'a' && c2 <= 'z')
                                {
                                    matching = 3;
                                    inCode = false;
                                    continue;
                                }
                            }
                        }
                        // end of string
                        else if (isInString)
                        {
                            if (c1 == '\\') { i++; continue; }
                            else if (c1 == 10 || c1 == 13) inString = 0;
                            else if ((inString == 1) && (c1 == '"')) inString = 0;
                            else if ((inString == 2) && (c1 == '\'')) inString = 0;

                            // extract "include" declarations
                            if (inString == 0 && length == 7 && context == 0)
                            {
                                string token = new string(buffer, 0, length);
                                if (token == "include")
                                {
                                    string inc = ba.Substring(tokPos, i - tokPos);
                                    if (model.MetaDatas == null) model.MetaDatas = new List<ASMetaData>();
                                    ASMetaData meta = new ASMetaData("Include");
                                    meta.ParseParams(inc);
                                    model.MetaDatas.Add(meta);
                                }
                            }
                        }
                        break;

                    // skip commented line
                    case 1:
                        if (c1 == 10 || c1 == 13)
                        {
                            // ignore single comments
                            commentLength = 0;
                            inCode = true;
                            matching = 0;
                        }
                        break;

                    // skip commented block
                    case 2:
                        if (c1 == '*')
                        {
                            bool end = false;
                            while (i < len)
                            {
                                c2 = ba[i];
                                if (c2 == '\\') { i++; continue; }
                                if (c2 == '/')
                                {
                                    end = true;
                                    break;
                                }
                                else if (c2 == '*') i++;
                                else break;
                            }
                            if (end)
                            {
                                lastComment = (commentLength > 0) ? new string(commentBuffer, 0, commentLength) : null;
                                // TODO  parse for TODO statements?
                                commentLength = 0;
                                inCode = true;
                                matching = 0;
                                i++;
                                continue;
                            }
                        }
                        break;

                    // directive/preprocessor statement
                    case 3:
                        if (c1 == 10 || c1 == 13 || (inlineDirective && c1 <= 32))
                        {
                            if (commentLength > 0)
                            {
                                string directive = new string(commentBuffer, 0, commentLength);
                                if (directive.StartsWith("if"))
                                {
                                    inCode = true;
                                }
                                else if (directive.StartsWith("else"))
                                {
                                    inCode = true;
                                }
                                else if (directive.StartsWith("end"))
                                {
                                    inCode = true; // directive end
                                    matching = 0;
                                }
                                else inCode = true;

                                // FD cache custom directive
                                if (cachedPath != null && directive.StartsWith("file-cache "))
                                {
                                    // parsing done!
                                    FinalizeModel();

                                    // next model
                                    string realFile = directive.Substring(11);
                                    FileModel newModel = model.Context != null ? model.Context.CreateFileModel(realFile) : new FileModel(realFile);
                                    newModel.LastWriteTime = cacheLastWriteTime;
                                    newModel.CachedModel = true;
                                    if (features != null && features.hasModules)
                                        newModel.Module = Path.GetFileNameWithoutExtension(realFile);
                                    haXe = newModel.haXe;
                                    if (!cachedPath.HasFile(realFile) && File.Exists(realFile))
                                    {
                                        newModel.OutOfDate = (File.GetLastWriteTime(realFile) > cacheLastWriteTime);
                                        cachedPath.AddFile(newModel);
                                    }
                                    model = newModel;
                                    goto resetParser; // loop
                                }
                            }
                            else inCode = true;
                            commentLength = 0;
                            matching = 0;
                        }

                        break;

                    // We are inside a /// comment
                    case 4:
                        {
                            bool end = false;
                            bool skipAhead = false;

                            // See if we just ended a line
                            if (2 <= i && (ba[i - 2] == 10 || ba[i - 2] == 13))
                            {
                                // Check ahead to the next line, see if it has a /// comment on it too.
                                // If it does, we want to continue the comment with that line.  If it
                                // doesn't, then this comment is finished and we will set end to true.
                                for (int j = i + 1; j < len; ++j)
                                {
                                    // Skip whitespace
                                    char twoBack = ba[j - 2];
                                    if (' ' != twoBack && '\t' != twoBack)
                                    {
                                        if ('/' == twoBack && '/' == ba[j - 1] && '/' == ba[j])
                                        {
                                            // There is a comment ahead.  Move up to it so we can gather the
                                            // rest of the comment
                                            i = j + 1;
                                            skipAhead = true;
                                            break;
                                        }
                                        else
                                        {
                                            // Not a comment!  We're done!
                                            end = true;
                                            break;
                                        }
                                    }
                                }
                            }
                            if (end)
                            {
                                // The comment is over and we want to write it out
                                lastComment = (commentLength > 0) ? new string(commentBuffer, 0, commentLength).Trim() : null;
                                commentLength = 0;
                                inCode = true;
                                matching = 0;

                                // Back up i so we can start gathering comments from right after the line break
                                --i;
                                continue;
                            }
                            if (skipAhead)
                            {
                                // We just hit another /// and are skipping up to right after it.
                                continue;
                            }
                            break;
                        }
                }

                /* LINE/COLUMN NUMBER */

                if (c1 == 10 || c1 == 13)
                {
                    if (cachedPath == null) line++; // cache breaks line count
                    if (c1 == 13 && i < len && ba[i] == 10) i++;
                }

                /* SKIP CONTENT */

                if (!inCode)
                {
                    // store comments
                    if (matching == 2 || (matching == 3 && handleDirectives) || matching == 4)
                    {
                        if (commentLength < COMMENTS_BUFFER) commentBuffer[commentLength++] = c1;
                    }
                    else if (matching == 1 && (c1 == '#' || c1 == '{'))
                    {
                        commentBuffer[commentLength++] = c1;
                        while (i < len)
                        {
                            c2 = ba[i];
                            if (commentLength < COMMENTS_BUFFER) commentBuffer[commentLength++] = c2;
                            if (c2 == 10 || c2 == 13)
                                break;
                            i++;
                        }

                        string comment = new String(commentBuffer, 0, commentLength);
                        Match match = ASFileParserRegexes.Region.Match(comment);
                        if (match.Success)
                        {
                            string regionName = match.Groups["name"].Value.Trim();
                            MemberModel region = new MemberModel(regionName, String.Empty, FlagType.Declaration, Visibility.Default);
                            region.LineFrom = region.LineTo = line;
                            model.Regions.Add(region);
                        }
                    }
                    continue;
                }
                else if (isInString)
                {
                    // store parameter default value
                    if (inValue && valueLength < VALUE_BUFFER)
                        valueBuffer[valueLength++] = c1;
                    continue;
                }
                if (braceCount > 0 && !inValue)
                {
                    if (c1 == '/')
                    {
                        LookupRegex(ref ba, ref i);
                    }
                    else if (c1 == '}')
                    {
                        lastComment = null;
                        braceCount--;
                        if (braceCount == 0 && curMethod != null)
                        {
                            curMethod.LineTo = line;
                            curMethod = null;
                        }
                    }
                    else if (c1 == '{') braceCount++;
                    // escape next char
                    else if (c1 == '\\') i++;
                    continue;
                }

                /* PARSE DECLARATION VALUES/TYPES */

                if (inValue)
                {
                    bool stopParser = false;
                    bool valueError = false;
                    if (inType && !inAnonType && !inGeneric && !Char.IsLetterOrDigit(c1) && ".{}-><".IndexOf(c1) < 0)
                    {
                        inType = false;
                        inValue = false;
                        inGeneric = false;
                        valueLength = 0;
                        length = 0;
                        context = 0;
                    }
                    else if (c1 == '{')
                    {
                        if (!inType || valueLength == 0 || valueBuffer[valueLength - 1] == '<' || paramBraceCount > 0)
                        {
                            paramBraceCount++;
                            stopParser = true;
                        }
                    }
                    else if (c1 == '}')
                    {
                        if (paramBraceCount > 0) { paramBraceCount--; stopParser = true; }
                        else valueError = true;
                    }
                    else if (c1 == '(')
                    {
                        paramParCount++;
                        stopParser = true;
                    }
                    else if (c1 == ')')
                    {
                        if (paramParCount > 0) { paramParCount--; stopParser = true; }
                        else valueError = true;
                    }
                    else if (c1 == '[') paramSqCount++;
                    else if (c1 == ']')
                    {
                        if (paramSqCount > 0) { paramSqCount--; stopParser = true; }
                        else valueError = true;
                    }
                    else if (c1 == '<')
                    {
                        if (i > 1 && ba[i - 2] == '<') paramTempCount = 0; // a << b
                        else
                        {
                            if (inType) inGeneric = true;
                            paramTempCount++;
                        }
                    }
                    else if (c1 == '>')
                    {
                        if (ba[i - 2] == '-') { /*haxe method signatures*/ }
                        else if (paramTempCount > 0)
                        {
                            paramTempCount--;
                            stopParser = true;
                        }
                        else valueError = true;
                    }
                    else if (c1 == '/')
                    {
                        int i0 = i;
                        if (LookupRegex(ref ba, ref i) && valueLength < VALUE_BUFFER - 3)
                        {
                            valueBuffer[valueLength++] = '/';
                            for (; i0 < i; i0++)
                                if (valueLength < VALUE_BUFFER - 2) valueBuffer[valueLength++] = ba[i0];
                            valueBuffer[valueLength++] = '/';
                            continue;
                        }
                    }
                    else if (inValue && (inParams || inType || inConst)
                        && c1 == '/' && valueLength == 0) // lookup native regex
                    {
                        int itemp = i;
                        valueBuffer[valueLength++] = '/';
                        while (valueLength < VALUE_BUFFER && i < len)
                        {
                            c1 = ba[i++];
                            if (c1 == '\n' || c1 == '\r')
                            {
                                valueLength = 0;
                                i = itemp;
                                break;
                            }
                            valueBuffer[valueLength++] = c1;
                            if (c1 == '\\' && i < len)
                            {
                                c1 = ba[i++];
                                valueBuffer[valueLength++] = c1;
                            }
                            else if (c1 == '/') break;
                        }
                    }
                    else if ((c1 == ':' || c1 == ',') && paramBraceCount > 0) stopParser = true;

                    // end of value
                    if ((valueError || (!stopParser && paramBraceCount == 0 && paramParCount == 0 && paramSqCount == 0 && paramTempCount == 0))
                        && (c1 == ',' || c1 == ';' || c1 == '}' || c1 == '\r' || c1 == '\n' || (inParams && c1 == ')') || inType))
                    {
                        if (!inType && (!inValue || c1 != ','))
                        {
                            length = 0;
                            context = 0;
                        }
                        inValue = false;
                        inGeneric = false;
                        //if (valueLength < VALUE_BUFFER) valueBuffer[valueLength++] = c1;
                    }

                    // in params, store the default value
                    else if ((inParams || inType || inConst) && valueLength < VALUE_BUFFER)
                    {
                        if (c1 <= 32)
                        {
                            if (valueLength > 0 && valueBuffer[valueLength - 1] != ' ')
                                valueBuffer[valueLength++] = ' ';
                        }
                        else valueBuffer[valueLength++] = c1;
                    }

                    // detect keywords
                    if (!Char.IsLetterOrDigit(c1))
                    {
                        // escape next char
                        if (c1 == '\\' && i < len)
                        {
                            c1 = ba[i++];
                            if (valueLength < VALUE_BUFFER) valueBuffer[valueLength++] = c1;
                            continue;
                        }
                        if (stopParser) continue;
                        else if (valueError && c1 == ')') inValue = false;
                        else if (inType && inGeneric && (c1 == '<' || c1 == '.')) continue;
                        else if (inAnonType) continue;
                        hadWS = true;
                    }
                }

                // store type / parameter value
                if (!inValue && valueLength > 0)
                {
                    string param = /*(valueBuffer[0] == '{' && valueBuffer[0] != '[') ? "..."
                        :*/ new string(valueBuffer, 0, valueLength);

                    // get text before the last keyword found
                    if (valueKeyword != null)
                    {
                        int p = param.LastIndexOf(valueKeyword.Text);
                        if (p > 0) param = param.Substring(0, p).TrimEnd();
                    }

                    if (curMember == null)
                    {
                        if (inType)
                        {
                            prevToken.Text = curToken.Text;
                            prevToken.Line = curToken.Line;
                            prevToken.Position = curToken.Position;
                            curToken.Text = param;
                            curToken.Line = tokLine;
                            curToken.Position = tokPos;
                            EvalToken(true, true/*false*/, i - 1 - valueLength);
                            evalToken = 0;
                        }
                    }
                    else if (inType)
                    {
                        foundColon = false;
                        if (haXe)
                        {
                            if (param.EndsWith("}") || param.Contains(">"))
                            {
                                param = ASFileParserRegexes.Spaces.Replace(param, "");
                                param = param.Replace(",", ", ");
                                param = param.Replace("->", " -> ");
                            }
                        }
                        curMember.Type = param;
                    }
                    // AS3 const or method parameter's default value
                    else if (version > 2 && (curMember.Flags & FlagType.Variable) > 0)
                    {
                        if (inParams || inConst) curMember.Value = param;
                        curMember.LineTo = line;
                        if (c1 == '\r' || c1 == '\n') curMember.LineTo--;
                        if (inConst && c1 != ',')
                        {
                            context = 0;
                            inConst = false;
                        }
                    }
                    //
                    valueLength = 0;
                    valueMember = null;
                    if (!inParams && !(inConst && context != 0) && c1 != '{') continue;
                    else length = 0;
                }

                /* TOKENIZATION */

                // whitespace
                if (c1 <= 32)
                {
                    hadWS = true;
                    continue;
                }
                // a dot can be in an identifier
                if (c1 == '.')
                {
                    if (length > 0 || (inParams && version == 3))
                    {
                        hadWS = false;
                        hadDot = true;
                        addChar = true;
                        if (!inValue && context == FlagType.Variable && !foundColon)
                        {
                            bool keepContext = inParams && (length == 0 || buffer[0] == '.');
                            if (!keepContext) context = 0;
                        }
                    }
                    else continue;
                }
                else
                {
                    // should we evaluate the token?
                    if (hadWS && !hadDot && !inGeneric && length > 0)
                    {
                        evalToken = 1;
                    }
                    hadWS = false;
                    hadDot = false;
                    bool shortcut = true;

                    // valid char for keyword
                    if (c1 >= 'a' && c1 <= 'z')
                    {
                        addChar = true;
                    }
                    else
                    {
                        // valid chars for identifiers
                        if (c1 >= 'A' && c1 <= 'Z')
                        {
                            addChar = true;
                        }
                        else if (c1 == '$' || c1 == '_')
                        {
                            addChar = true;
                        }
                        else if (length > 0)
                        {
                            if (c1 >= '0' && c1 <= '9')
                            {
                                addChar = true;
                            }
                            else if (c1 == '*' && context == FlagType.Import)
                            {
                                addChar = true;
                            }
                            // AS3/haXe generics
                            else if (features.hasGenerics && c1 == '<')
                            {
                                if (!inValue && i > 2 && length > 1 && i < len - 3
                                    && Char.IsLetterOrDigit(ba[i - 3]) && (Char.IsLetter(ba[i]) || (haXe && ba[i] == '{'))
                                    && (Char.IsLetter(buffer[0]) || buffer[0] == '_'))
                                {
                                    if (curMember == null)
                                    {
                                        evalToken = 0;
                                        if (inGeneric) paramTempCount++;
                                        else
                                        {
                                            paramTempCount = 1;
                                            inGeneric = true;
                                        }
                                        addChar = true;
                                    }
                                    else
                                    {
                                        evalToken = 0;
                                        inGeneric = true;
                                        inValue = true;
                                        inType = true;
                                        inAnonType = false;
                                        valueLength = 0;
                                        for (int j = 0; j < length; j++)
                                            valueBuffer[valueLength++] = buffer[j];
                                        valueBuffer[valueLength++] = c1;
                                        length = 0;
                                        paramBraceCount = 0;
                                        paramParCount = 0;
                                        paramSqCount = 0;
                                        paramTempCount = 1;
                                        continue;
                                    }
                                }
                            }
                            else if (inGeneric && (c1 == ',' || c1 == '.' || c1 == '-' || c1 == '>' || c1 == ':'))
                            {
                                hadWS = false;
                                hadDot = false;
                                evalToken = 0;
                                if (!inValue)
                                {
                                    addChar = true;
                                    if (c1 == '>' && inGeneric)
                                    {
                                        if (paramTempCount > 0) paramTempCount--;
                                        if (paramTempCount == 0 && paramBraceCount == 0
                                            && paramSqCount == 0 && paramParCount == 0) inGeneric = false;
                                    }
                                }
                            }
                            else
                            {
                                evalToken = 2;
                                shortcut = false;
                            }
                        }
                        // star is valid in import statements
                        else if (c1 == '*' && version == 3)
                        {
                            addChar = true;
                        }
                        // conditional haXe parameter
                        else if (c1 == '?' && haXe && inParams && length == 0)
                        {
                            addChar = true;
                        }
                        else shortcut = false;
                    }

                    // eval this word
                    if (evalToken > 0)
                    {
                        prevToken.Text = curToken.Text;
                        prevToken.Line = curToken.Line;
                        prevToken.Position = curToken.Position;
                        curToken.Text = new string(buffer, 0, length);
                        curToken.Line = tokLine;
                        curToken.Position = tokPos;
                        EvalToken(!inValue, (c1 != '=' && c1 != ','), i - 1 - length);
                        length = 0;
                        evalToken = 0;
                    }

                    if (!shortcut)
                        // start of block
                        if (c1 == '{')
                        {
                            if (context == FlagType.Package || context == FlagType.Class) // parse package/class block
                            {
                                context = 0;
                            }
                            else if (context == FlagType.Enum) // parse enum block
                            {
                                if (curClass != null && (curClass.Flags & FlagType.Enum) > 0)
                                    inEnum = true;
                                else
                                {
                                    context = 0;
                                    curModifiers = 0;
                                    braceCount++; // ignore block
                                }
                            }
                            else if (context == FlagType.TypeDef) // parse typedef block
                            {
                                if (curClass != null && (curClass.Flags & FlagType.TypeDef) > 0)
                                {
                                    inTypedef = true;
                                    if (i < len && ba[i] == '>')
                                    {
                                        buffer[0] = 'e'; buffer[1] = 'x'; buffer[2] = 't'; buffer[3] = 'e'; buffer[4] = 'n'; buffer[5] = 'd'; buffer[6] = 's';
                                        length = 7;
                                        context = FlagType.Class;
                                    }
                                }
                                else
                                {
                                    context = 0;
                                    curModifiers = 0;
                                    braceCount++; // ignore block
                                }
                            }
                            else if (context == FlagType.Abstract) // parse abstract block
                            {
                                if (curClass != null && (curClass.Flags & FlagType.Abstract) > 0)
                                    inAbstract = true;
                                else
                                {
                                    context = 0;
                                    curModifiers = 0;
                                    braceCount++; // ignore block
                                }
                            }
                            else if (foundColon && haXe && length == 0) // copy haXe anonymous type
                            {
                                inValue = true;
                                inType = true;
                                inAnonType = true;
                                valueLength = 0;
                                valueBuffer[valueLength++] = c1;
                                paramBraceCount = 1;
                                paramParCount = 0;
                                paramSqCount = 0;
                                paramTempCount = 0;
                                continue;
                            }
                            else if (foundConstant) // start config block
                            {
                                flattenNextBlock++;
                                foundConstant = false;
                                context = 0;
                            }
                            else if (ScriptMode) // not in a class, parse if/for/while/do blocks
                            {
                                context = 0;
                            }
                            else braceCount++; // ignore block
                        }

                        // end of block
                        else if (c1 == '}')
                        {
                            curComment = null;
                            foundColon = false;
                            foundConstant = false;

                            if (flattenNextBlock > 0) // content of this block was parsed
                            {
                                flattenNextBlock--;
                            }

                            // outside of a method, the '}' ends the current class
                            else if (curClass != null)
                            {
                                if (curClass != null) curClass.LineTo = line;
                                curClass = null;
                                inEnum = false;
                                inTypedef = false;
                                inAbstract = false;
                            }
                            else
                            {
                                if (hasPackageSection && model.PrivateSectionIndex == 0) model.PrivateSectionIndex = line + 1;
                            }
                        }

                        // member type declaration
                        else if (c1 == ':' && !inValue && !inGeneric)
                        {
                            foundColon = curMember != null && curMember.Type == null;
                            // recognize compiler config block
                            if (!foundColon && braceCount == 0
                                && i < len - 2 && ba[i] == ':' && Char.IsLetter(ba[i + 1]))
                                foundConstant = true;
                        }

                        // next variable declaration
                        else if (c1 == ',')
                        {
                            if ((context == FlagType.Variable || context == FlagType.TypeDef) && curMember != null)
                            {
                                curAccess = curMember.Access;
                                foundKeyword = FlagType.Variable;
                                foundColon = false;
                                lastComment = null;
                            }
                            else if (context == FlagType.Class && prevToken.Text == "implements")
                            {
                                curToken.Text = "implements";
                                foundKeyword = FlagType.Implements;
                            }
                        }

                        else if (c1 == '(')
                        {
                            if (!inValue && context == FlagType.Variable && curToken.Text != "catch" && (!haXe || curToken.Text != "for"))
                                if (haXe && curMember != null && valueLength == 0) // haXe properties
                                {
                                    curMember.Flags -= FlagType.Variable;
                                    curMember.Flags |= FlagType.Getter | FlagType.Setter;
                                    context = FlagType.Function;
                                }
                                else context = 0;

                            // beginning of method parameters
                            if (context == FlagType.Function)
                            {
                                context = FlagType.Variable;
                                inParams = true;
                                inGeneric = false;
                                if (valueMember != null && curMember == null)
                                {
                                    valueLength = 0;
                                    //valueMember.Flags -= FlagType.Variable; ???
                                    valueMember.Flags = FlagType.Function;
                                    curMethod = curMember = valueMember;
                                    valueMember = null;
                                }
                                else if (curMember == null)
                                {
                                    context = FlagType.Function;
                                    if ((curModifiers & FlagType.Getter) > 0)
                                    {
                                        curModifiers -= FlagType.Getter;
                                        EvalToken(true, false, i);
                                        curMethod = curMember;
                                        context = FlagType.Variable;
                                    }
                                    else if ((curModifiers & FlagType.Setter) > 0)
                                    {
                                        curModifiers -= FlagType.Setter;
                                        EvalToken(true, false, i);
                                        curMethod = curMember;
                                        context = FlagType.Variable;
                                    }
                                    else
                                    {
                                        inParams = false;
                                        context = 0;
                                    }
                                }
                                else
                                {
                                    curMethod = curMember;
                                }
                            }

                            // an Enum value with parameters
                            else if (inEnum && curToken != null)
                            {
                                context = FlagType.Variable;
                                inParams = true;
                                curMethod = curMember ?? new MemberModel();
                                curMethod.Name = curToken.Text;
                                curMethod.Flags = curModifiers | FlagType.Function | FlagType.Static;
                                curMethod.Parameters = new List<MemberModel>();
                                //
                                if (curClass != null && curMember == null) curClass.Members.Add(curMethod);
                            }

                            // a TypeDef method with parameters
                            else if (inTypedef && curToken != null)
                            {
                                context = FlagType.Variable;
                                inParams = true;
                                curMethod = curMember ?? new MemberModel();
                                curMethod.Name = curToken.Text;
                                curMethod.Flags = curModifiers | FlagType.Function;
                                curMethod.Parameters = new List<MemberModel>();
                                //
                                if (curClass != null && curMember == null) curClass.Members.Add(curMethod);
                            }

                            // an Abstract "opaque type"
                            else if (context == FlagType.Abstract && prevToken.Text == "abstract")
                            {
                                foundKeyword = FlagType.Class;
                                curModifiers = FlagType.Extends;
                            }

                            else if (curMember == null && curToken.Text != "catch" && (!haXe || curToken.Text != "for"))
                            {
                                context = 0;
                                inGeneric = false;
                            }
                        }

                        // end of statement
                        else if (c1 == ';')
                        {
                            context = (inEnum) ? FlagType.Enum : 0;
                            inGeneric = false;
                            modifiers = 0;
                            inParams = false;
                            curMember = null;
                        }

                        // end of method parameters
                        else if (c1 == ')' && inParams)
                        {
                            context = 0;
                            if (inEnum) context = FlagType.Enum;
                            else if (inTypedef) context = FlagType.TypeDef;
                            modifiers = 0;
                            inParams = false;
                            curMember = curMethod;
                        }

                        // skip value of a declared variable
                        else if (c1 == '=')
                        {
                            if (context == FlagType.Variable || (context == FlagType.Enum && inEnum))
                            {
                                if (!inValue && curMember != null)
                                {
                                    inValue = true;
                                    inConst = (curMember.Flags & FlagType.Constant) > 0;
                                    inType = false;
                                    inGeneric = false;
                                    paramBraceCount = 0;
                                    paramParCount = 0;
                                    paramSqCount = 0;
                                    paramTempCount = 0;
                                    valueLength = 0;
                                    valueMember = curMember;
                                }
                            }
                        }

                        // metadata
                        else if (!inValue && c1 == '[')
                        {
                            if (version == 3) LookupMeta(ref ba, ref i);
                            else if (features.hasCArrays && curMember != null && curMember.Type != null)
                            {
                                if (ba[i] == ']') curMember.Type = features.CArrayTemplate + "@" + curMember.Type;
                            }
                        }

                        // haXe signatures: T -> T -> T
                        else if (haXe && c1 == '-' && curMember != null)
                        {
                            if (ba[i] == '>' && curMember.Type != null)
                            {
                                curMember.Type += " ->";
                                foundColon = true;
                            }
                        }

                        // escape next char
                        else if (c1 == '\\') { i++; continue; }

                        // literal regex
                        else if (c1 == '/' && version == 3)
                        {
                            if (LookupRegex(ref ba, ref i))
                                continue;
                        }
                }

                // put in buffer
                if (addChar)
                {
                    if (length < TOKEN_BUFFER) buffer[length++] = c1;

                    if (length == 1)
                    {
                        tokPos = i - 1;
                        tokLine = line;
                    }
                    addChar = false;
                }
            }

            // parsing done!
            FinalizeModel();

            // post-filtering
            if (cachedPath == null && model.HasFiltering && model.Context != null)
                model.Context.FilterSource(model);

            //	Debug.WriteLine("out model: " + model.GenerateIntrinsic(false));
        }
コード例 #8
0
ファイル: ASFileParser.cs プロジェクト: thecocce/flashdevelop
 private void AddClass(FileModel model, ClassModel curClass)
 {
     // avoid empty duplicates due to Haxe directives
     foreach(ClassModel aClass in model.Classes)
         if (aClass.Name == curClass.Name)
         {
             if (aClass.Members.Count == 0)
             {
                 model.Classes.Remove(aClass);
                 break;
             }
             else return;
         }
     model.Classes.Add(curClass);
 }
コード例 #9
0
ファイル: Context.cs プロジェクト: JoeRobich/flashdevelop
        /// <summary>
        /// Prepare Loom intrinsic known vars/methods/classes
        /// </summary>
        protected override void InitTopLevelElements()
        {
            string filename = "toplevel.ls";
            topLevel = new FileModel(filename);

            if (topLevel.Members.Search("this", 0, 0) == null)
                topLevel.Members.Add(new MemberModel("this", "", FlagType.Variable | FlagType.Intrinsic, Visibility.Public));
            if (topLevel.Members.Search("super", 0, 0) == null)
                topLevel.Members.Add(new MemberModel("super", "", FlagType.Variable | FlagType.Intrinsic, Visibility.Public));
            if (topLevel.Members.Search(features.voidKey, 0, 0) == null)
                topLevel.Members.Add(new MemberModel(features.voidKey, "", FlagType.Intrinsic, Visibility.Public));
            topLevel.Members.Sort();
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: heon21st/flashdevelop
        private static void AddEvents(FileModel aFile, BlockModel docModel, bool targetAIR, bool targetFP10)
        {
            aFile.MetaDatas = new List<ASMetaData>();
            foreach (EventModel ev in docModel.Events)
            {
                if (!targetAIR && ev.IsAIR) continue;
                if (!targetFP10 && ev.IsFP10) continue;

                int p = ev.EventType.LastIndexOf('.');
                string type = ev.EventType.Substring(0, p);
                string pname = ev.EventType.Substring(p + 1);
                ClassModel eClass = getClass(type);
                if (eClass.IsVoid()) continue;
                string value = '"' + ev.Name + '"';
                if (eClass.Members.Items.Any<MemberModel>(item => item.Name == pname))
                {
                    ASMetaData meta = new ASMetaData("Event");
                    if (ev.Comment != null)
                        meta.Comments = "\r\n\t * " + ev.Comment + "\r\n\t * @eventType " + ev.EventType;
                    meta.ParseParams(String.Format("name=\"{0}\", type=\"{1}\"", ev.Name, type));
                    aFile.MetaDatas.Add(meta);
                }
            }
        }
コード例 #11
0
            public void ParseFile_GenericsWithObjectConstraints()
            {
                using (
                    var resourceFile =
                        new TestFile("ASCompletion.Test_Files.parser.haxe.GenericsObjectConstraintTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(3, model.Classes.Count);

                    var objectConstraintGeneric = model.Classes[0];
                    Assert.AreEqual(2, objectConstraintGeneric.LineFrom);
                    Assert.AreEqual(11, objectConstraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, objectConstraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestObjectConstraint<T:({},Measurable)>", objectConstraintGeneric.FullName);
                    Assert.AreEqual("TestObjectConstraint", objectConstraintGeneric.Name);
                    Assert.AreEqual("<T:({},Measurable)>", objectConstraintGeneric.Template);
                    Assert.AreEqual(2, objectConstraintGeneric.Members.Count);
                    var member = objectConstraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(4, member.LineFrom);
                    Assert.AreEqual(6, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    var arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    member = objectConstraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:({},Measurable)>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:({},Measurable)>", member.Template);
                    Assert.AreEqual(8, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("K", arg.Type);

                    var fullConstraintGeneric = model.Classes[1];
                    Assert.AreEqual(13, fullConstraintGeneric.LineFrom);
                    Assert.AreEqual(22, fullConstraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, fullConstraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestFullConstraint<T:({},Measurable),Z:(Iterable<String>,Measurable)>",
                        fullConstraintGeneric.FullName);
                    Assert.AreEqual("TestFullConstraint", fullConstraintGeneric.Name);
                    Assert.AreEqual("<T:({},Measurable),Z:(Iterable<String>,Measurable)>",
                        fullConstraintGeneric.Template);
                    Assert.AreEqual(2, fullConstraintGeneric.Members.Count);
                    member = fullConstraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(15, member.LineFrom);
                    Assert.AreEqual(17, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("Z", arg.Type);
                    member = fullConstraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:({},Measurable),V:(Iterable<String>,Measurable)>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:({},Measurable),V:(Iterable<String>,Measurable)>", member.Template);
                    Assert.AreEqual(19, member.LineFrom);
                    Assert.AreEqual(21, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("V", arg.Type);

                    // TODO: There should be a space between 'function' and 'new'! There should be a separate test covering this error
                    var typeDefConstraintGeneric = model.Classes[2];
                    Assert.AreEqual(24, typeDefConstraintGeneric.LineFrom);
                    Assert.AreEqual(33, typeDefConstraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, typeDefConstraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestTypeDefConstraint<T:({functionnew():Void;},Measurable)>", typeDefConstraintGeneric.FullName);
                    Assert.AreEqual("TestTypeDefConstraint", typeDefConstraintGeneric.Name);
                    Assert.AreEqual("<T:({functionnew():Void;},Measurable)>", typeDefConstraintGeneric.Template);
                    Assert.AreEqual(2, typeDefConstraintGeneric.Members.Count);
                    member = typeDefConstraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(26, member.LineFrom);
                    Assert.AreEqual(28, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    member = typeDefConstraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:({functionnew():Void;},Measurable)>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:({functionnew():Void;},Measurable)>", member.Template);
                    Assert.AreEqual(30, member.LineFrom);
                    Assert.AreEqual(32, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("K", arg.Type);

                }
            }
コード例 #12
0
            public void ParseFile_TypeDefs()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.TypeDefsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(7, model.Classes.Count);

                    var aliasTypeDef = model.Classes[0];
                    Assert.AreEqual(2, aliasTypeDef.LineFrom);
                    Assert.AreEqual(2, aliasTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, aliasTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("Array<Int>", aliasTypeDef.ExtendsType);
                    Assert.AreEqual("Alias", aliasTypeDef.FullName);

                    var iterableTypeDef = model.Classes[1];
                    Assert.AreEqual(4, iterableTypeDef.LineFrom);
                    Assert.AreEqual(6, iterableTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, iterableTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("Iterable<T>", iterableTypeDef.FullName);
                    Assert.AreEqual("Iterable", iterableTypeDef.Name);
                    Assert.AreEqual("<T>", iterableTypeDef.Template);
                    Assert.AreEqual(1, iterableTypeDef.Members.Count);
                    var member = iterableTypeDef.Members[0];
                    Assert.AreEqual("iterator", member.Name);
                    Assert.AreEqual(5, member.LineFrom);
                    Assert.AreEqual(5, member.LineTo);
                    Assert.AreEqual("Iterator<T>", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);

                    var typeWithOptionalATypeDef = model.Classes[2];
                    Assert.AreEqual(8, typeWithOptionalATypeDef.LineFrom);
                    Assert.AreEqual(12, typeWithOptionalATypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, typeWithOptionalATypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("TypeWithOptionalA", typeWithOptionalATypeDef.FullName);
                    Assert.AreEqual(3, typeWithOptionalATypeDef.Members.Count);
                    member = typeWithOptionalATypeDef.Members[0];
                    Assert.AreEqual("age", member.Name);
                    Assert.AreEqual(9, member.LineFrom);
                    Assert.AreEqual(9, member.LineTo);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = typeWithOptionalATypeDef.Members[1];
                    Assert.AreEqual("name", member.Name);
                    Assert.AreEqual(10, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = typeWithOptionalATypeDef.Members[2];
                    Assert.AreEqual("phoneNumber", member.Name);
                    Assert.AreEqual(11, member.LineFrom);
                    Assert.AreEqual(11, member.LineTo);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    var typeWithOptionalBTypeDef = model.Classes[3];
                    Assert.AreEqual(14, typeWithOptionalBTypeDef.LineFrom);
                    Assert.AreEqual(17, typeWithOptionalBTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, typeWithOptionalBTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("TypeWithOptionalB", typeWithOptionalBTypeDef.FullName);
                    Assert.AreEqual(2, typeWithOptionalBTypeDef.Members.Count);
                    member = typeWithOptionalBTypeDef.Members[0];
                    Assert.AreEqual("optionalString", member.Name);
                    Assert.AreEqual(15, member.LineFrom);
                    Assert.AreEqual(15, member.LineTo);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = typeWithOptionalBTypeDef.Members[1];
                    Assert.AreEqual("requiredInt", member.Name);
                    Assert.AreEqual(16, member.LineFrom);
                    Assert.AreEqual(16, member.LineTo);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    var singleLineTypeDef = model.Classes[4];
                    Assert.AreEqual(19, singleLineTypeDef.LineFrom);
                    Assert.AreEqual(19, singleLineTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, singleLineTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("SingleLine", singleLineTypeDef.FullName);
                    Assert.AreEqual(2, singleLineTypeDef.Members.Count);
                    member = singleLineTypeDef.Members[0];
                    Assert.AreEqual("x", member.Name);
                    Assert.AreEqual(19, member.LineFrom);
                    Assert.AreEqual(19, member.LineTo);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = singleLineTypeDef.Members[1];
                    Assert.AreEqual("y", member.Name);
                    Assert.AreEqual(19, member.LineFrom);
                    Assert.AreEqual(19, member.LineTo);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    var normalDefTypeDef = model.Classes[5];
                    Assert.AreEqual(21, normalDefTypeDef.LineFrom);
                    Assert.AreEqual(24, normalDefTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, normalDefTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("NormalDef", normalDefTypeDef.FullName);
                    Assert.AreEqual(2, normalDefTypeDef.Members.Count);
                    member = normalDefTypeDef.Members[0];
                    Assert.AreEqual("aliases", member.Name);
                    Assert.AreEqual(22, member.LineFrom);
                    Assert.AreEqual(22, member.LineTo);
                    Assert.AreEqual("Array<String>", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = normalDefTypeDef.Members[1];
                    Assert.AreEqual("processFunction", member.Name);
                    Assert.AreEqual(23, member.LineFrom);
                    Assert.AreEqual(23, member.LineTo);
                    Assert.AreEqual("Dynamic", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    var shortDefTypeDef = model.Classes[6];
                    Assert.AreEqual(26, shortDefTypeDef.LineFrom);
                    Assert.AreEqual(29, shortDefTypeDef.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, shortDefTypeDef.Flags & FlagType.TypeDef);
                    Assert.AreEqual("ShortDef", shortDefTypeDef.FullName);
                    Assert.AreEqual(2, shortDefTypeDef.Members.Count);
                    member = shortDefTypeDef.Members[0];
                    Assert.AreEqual("aliases", member.Name);
                    Assert.AreEqual(27, member.LineFrom);
                    Assert.AreEqual(27, member.LineTo);
                    Assert.AreEqual("Array<String>", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = shortDefTypeDef.Members[1];
                    Assert.AreEqual("processFunction", member.Name);
                    Assert.AreEqual(28, member.LineFrom);
                    Assert.AreEqual(28, member.LineTo);
                    Assert.AreEqual("Dynamic", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                }
            }
コード例 #13
0
            public void ParseFile_StringWithEscapedChars()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.EscapedStringsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);

                    Assert.AreEqual(1, model.Classes.Count);
                    var classModel = model.Classes[0];

                    Assert.AreEqual(1, classModel.Members.Count);
                    var member = classModel.Members[0];
                    Assert.AreEqual("test", member.Name);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(4, member.LineFrom);
                    Assert.AreEqual(6, member.LineTo);
                    Assert.AreEqual(2, member.Parameters.Count);
                    var param = member.Parameters[0];
                    Assert.AreEqual("arg", param.Name);
                    Assert.AreEqual("String", param.Type);
                    Assert.AreEqual("\"hello \\t\\r\\n\\\\\\\"\\\\\"", param.Value);
                    Assert.AreEqual(4, param.LineFrom);
                    Assert.AreEqual(4, param.LineTo);
                    param = member.Parameters[1];
                    Assert.AreEqual("arg2", param.Name);
                    Assert.AreEqual("String", param.Type);
                    Assert.AreEqual(@"'hello \t\r\n\\\\'", param.Value);
                    Assert.AreEqual(4, param.LineFrom);
                    Assert.AreEqual(4, param.LineTo);
                }
            }
コード例 #14
0
            public void ParseFile_SpecialClassesComments()
            {
                using (
                    var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.SpecialClassesCommentsTest.hx")
                    )
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(3, model.Classes.Count);

                    var classModel = model.Classes[0];
                    Assert.AreEqual("TypedefTest", classModel.Name);
                    Assert.AreEqual("\r * Some typedef custom comments\r ", classModel.Comments);
                    Assert.AreEqual(5, classModel.LineFrom);
                    Assert.AreEqual(11, classModel.LineTo);
                    Assert.AreEqual(FlagType.TypeDef, classModel.Flags & FlagType.TypeDef);
                    Assert.AreEqual(1, classModel.Members.Count);
                    var member = classModel.Members[0];
                    Assert.AreEqual(10, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual("age", member.Name);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual("Java Style comments", member.Comments);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    classModel = model.Classes[1];
                    Assert.AreEqual("EnumTest", classModel.Name);
                    Assert.AreEqual("\r * Some enum custom comments\r ", classModel.Comments);
                    Assert.AreEqual(16, classModel.LineFrom);
                    Assert.AreEqual(22, classModel.LineTo);
                    Assert.AreEqual(FlagType.Enum, classModel.Flags & FlagType.Enum);
                    Assert.AreEqual(1, classModel.Members.Count);
                    member = classModel.Members[0];
                    Assert.AreEqual(21, member.LineFrom);
                    Assert.AreEqual(21, member.LineTo);
                    Assert.AreEqual("Foo", member.Name);
                    //TODO: Add support for this!
                    //Assert.AreEqual("\r\t * Enum element comments\r\t ", member.Comments);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    classModel = model.Classes[2];
                    Assert.AreEqual("AbstractInt", classModel.Name);
                    Assert.AreEqual("\r * Some abstract custom comments\r ", classModel.Comments);
                    Assert.AreEqual("Int", classModel.ExtendsType);
                    Assert.AreEqual(27, classModel.LineFrom);
                    Assert.AreEqual(34, classModel.LineTo);
                    Assert.AreEqual(FlagType.Abstract, classModel.Flags & FlagType.Abstract);
                    Assert.AreEqual(1, classModel.Members.Count);
                    member = classModel.Members[0];
                    Assert.AreEqual(31, member.LineFrom);
                    Assert.AreEqual(33, member.LineTo);
                    Assert.AreEqual("new", member.Name);
                    Assert.AreEqual("Java Style comments", member.Comments);
                }
            }
コード例 #15
0
            public void ParseFile_Regions()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.RegionsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(1, model.Classes.Count);
                    Assert.AreEqual(2, model.Regions.Count);

                    var region = model.Regions[0];
                    Assert.AreEqual("Fields", region.Name);
                    Assert.AreEqual(4, region.LineFrom);
                    Assert.AreEqual(6, region.LineTo);
                    region = model.Regions[1];
                    Assert.AreEqual("Complex stuff", region.Name);
                    Assert.AreEqual(14, region.LineFrom);
                    Assert.AreEqual(16, region.LineTo);

                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(2, classModel.LineFrom);
                    Assert.AreEqual(18, classModel.LineTo);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(3, classModel.Members.Count);
                    var member = classModel.Members[0];
                    Assert.AreEqual(5, member.LineFrom);
                    Assert.AreEqual(5, member.LineTo);
                    Assert.AreEqual("_test", member.Name);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    Assert.AreEqual(Visibility.Private, member.Access & Visibility.Private);
                    member = classModel.Members[1];
                    Assert.AreEqual(9, member.LineFrom);
                    Assert.AreEqual(9, member.LineTo);
                    Assert.AreEqual("_test2", member.Name);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    Assert.AreEqual(Visibility.Private, member.Access & Visibility.Private);
                    member = classModel.Members[2];
                    Assert.AreEqual(12, member.LineFrom);
                    Assert.AreEqual(17, member.LineTo);
                    Assert.AreEqual("regionInside", member.Name);
                    Assert.AreEqual("String", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(Visibility.Private, member.Access & Visibility.Private);
                }
            }
コード例 #16
0
ファイル: PathModel.cs プロジェクト: wise0704/FlashDevelop
        private void DoScheduledOperations()
        {
            // copy scheduled paths
            string[] _toCheck;
            string[] _toExplore;
            if (toExplore.Count == 0)
            {
                return;
            }
            _toCheck   = new string[toExplore.Count];
            _toExplore = new string[toExplore.Count];
            for (int i = 0; i < _toExplore.Length; i++)
            {
                _toCheck[i]   = toExplore[i].ToUpper() + System.IO.Path.DirectorySeparatorChar;
                _toExplore[i] = toExplore[i];
            }
            toExplore.Clear();

            List <string> _toRemove;

            _toRemove = new List <string>(toRemove.Count);
            for (int i = 0; i < _toRemove.Count; i++)
            {
                _toRemove[i] = toRemove[i].ToUpper() + System.IO.Path.DirectorySeparatorChar;
            }
            toRemove.Clear();

            Dictionary <string, FileModel> newFiles = new Dictionary <string, FileModel>();

            // cleanup files
            foreach (string file in files.Keys)
            {
                bool drop = false;
                foreach (string remPath in _toRemove)
                {
                    if (file.StartsWithOrdinal(remPath))
                    {
                        //TraceManager.Add("drop: " + files[file].FileName);
                        drop = true;
                        break;
                    }
                }
                if (drop)
                {
                    continue;
                }

                FileModel model = files[file];
                foreach (string checkPath in _toCheck)
                {
                    if (!File.Exists(model.FileName))
                    {
                        if (!Directory.Exists(System.IO.Path.GetDirectoryName(model.FileName)))
                        {
                            string newRemPath = System.IO.Path.GetDirectoryName(model.FileName).ToUpper() + System.IO.Path.DirectorySeparatorChar;
                            _toRemove.Add(newRemPath);
                        }
                        //TraceManager.Add("drop2: " + files[file].FileName);
                        drop = true;
                        break;
                    }
                }
                if (drop)
                {
                    continue;
                }
                newFiles[file] = model;
            }
            files = newFiles;

            // add new files
            foreach (string path in _toExplore)
            {
                AddNewFilesIn(path);
            }
        }
コード例 #17
0
            public void ParseFile_Generics()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.GenericsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(4, model.Classes.Count);

                    var simpleGeneric = model.Classes[0];
                    Assert.AreEqual(2, simpleGeneric.LineFrom);
                    Assert.AreEqual(11, simpleGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, simpleGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("Test<T>", simpleGeneric.FullName);
                    Assert.AreEqual("Test", simpleGeneric.Name);
                    Assert.AreEqual("<T>", simpleGeneric.Template);
                    Assert.AreEqual(2, simpleGeneric.Members.Count);
                    var member = simpleGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(4, member.LineFrom);
                    Assert.AreEqual(6, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    var arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    member = simpleGeneric.Members[1];
                    Assert.AreEqual("test2<K>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K>", member.Template);
                    Assert.AreEqual(8, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("K", arg.Type);

                    var constraintGeneric = model.Classes[1];
                    Assert.AreEqual(13, constraintGeneric.LineFrom);
                    Assert.AreEqual(22, constraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, constraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestConstraint<T:Iterable<String>>", constraintGeneric.FullName);
                    Assert.AreEqual("TestConstraint", constraintGeneric.Name);
                    Assert.AreEqual("<T:Iterable<String>>", constraintGeneric.Template);
                    Assert.AreEqual(2, constraintGeneric.Members.Count);
                    member = constraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(15, member.LineFrom);
                    Assert.AreEqual(17, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    member = constraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:Iterable<String>>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:Iterable<String>>", member.Template);
                    Assert.AreEqual(19, member.LineFrom);
                    Assert.AreEqual(21, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("K", arg.Type);

                    var multipleConstraintGeneric = model.Classes[2];
                    Assert.AreEqual(24, multipleConstraintGeneric.LineFrom);
                    Assert.AreEqual(33, multipleConstraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, multipleConstraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestMultiple<T:(Iterable<String>,Measurable)>", multipleConstraintGeneric.FullName);
                    Assert.AreEqual("TestMultiple", multipleConstraintGeneric.Name);
                    Assert.AreEqual("<T:(Iterable<String>,Measurable)>", multipleConstraintGeneric.Template);
                    Assert.AreEqual(2, multipleConstraintGeneric.Members.Count);
                    member = multipleConstraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(26, member.LineFrom);
                    Assert.AreEqual(28, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    member = multipleConstraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:(Iterable<String>,Measurable)>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:(Iterable<String>,Measurable)>", member.Template);
                    Assert.AreEqual(30, member.LineFrom);
                    Assert.AreEqual(32, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("K", arg.Type);

                    var complexConstraintGeneric = model.Classes[3];
                    Assert.AreEqual(35, complexConstraintGeneric.LineFrom);
                    Assert.AreEqual(44, complexConstraintGeneric.LineTo);
                    Assert.AreEqual(FlagType.Class, complexConstraintGeneric.Flags & FlagType.Class);
                    Assert.AreEqual("TestFullConstraint<T:Measurable,Z:(Iterable<String>,Measurable)>",
                        complexConstraintGeneric.FullName);
                    Assert.AreEqual("TestFullConstraint", complexConstraintGeneric.Name);
                    Assert.AreEqual("<T:Measurable,Z:(Iterable<String>,Measurable)>", complexConstraintGeneric.Template);
                    Assert.AreEqual(2, complexConstraintGeneric.Members.Count);
                    member = complexConstraintGeneric.Members[0];
                    Assert.AreEqual("test1", member.Name);
                    Assert.AreEqual(37, member.LineFrom);
                    Assert.AreEqual(39, member.LineTo);
                    Assert.AreEqual("T", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(2, member.Parameters.Count);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("T", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("Z", arg.Type);
                    member = complexConstraintGeneric.Members[1];
                    Assert.AreEqual("test2<K:Measurable,V:(Iterable<String>,Measurable)>", member.FullName);
                    Assert.AreEqual("test2", member.Name);
                    Assert.AreEqual("<K:Measurable,V:(Iterable<String>,Measurable)>", member.Template);
                    Assert.AreEqual(41, member.LineFrom);
                    Assert.AreEqual(43, member.LineTo);
                    Assert.AreEqual("K", member.Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    arg = member.Parameters[0];
                    Assert.AreEqual("expected", arg.Name);
                    Assert.AreEqual("K", arg.Type);
                    arg = member.Parameters[1];
                    Assert.AreEqual("actual", arg.Name);
                    Assert.AreEqual("V", arg.Type);
                }
            }
コード例 #18
0
            public void ParseFile_WrongSyntaxCompilerMetaAfterVarWithNoType()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.WrongSyntaxCompilerMetaAfterVarWithNoType.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("WrongSyntaxMetadataTest", classModel.Name);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.LineFrom);
                    //I'd say this should be possible
                    //Assert.AreEqual(9, classModel.LineTo);
                    Assert.AreEqual(2, classModel.Members.Count);

                    var memberModel = classModel.Members[0];
                    Assert.AreEqual("func", memberModel.Name);
                    Assert.AreEqual(null, memberModel.Type);
                    var flags = FlagType.Variable;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(6, memberModel.LineFrom);
                    Assert.AreEqual(6, memberModel.LineTo);
                    Assert.AreEqual(" Dummy data to make sure this method keeps values at the end of the parsing ", memberModel.Comments);
                    Assert.AreEqual("dummy", memberModel.MetaDatas[0].Name);
                }
            }
コード例 #19
0
            public void ParseFile_IdentifiersWithUnicodeChars()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.IdentifiersWithUnicodeCharsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.LineFrom);
                    Assert.AreEqual(9, classModel.LineTo);
                    Assert.AreEqual(2, classModel.Members.Count);

                    var memberModel = classModel.Members[0];
                    Assert.AreNotEqual("thísIsVälid", memberModel.Name);
                    Assert.AreEqual(4, memberModel.LineFrom);
                    Assert.AreEqual(6, memberModel.LineTo);

                    memberModel = classModel.Members[1];
                    Assert.AreNotEqual("日本語文字ヴァリアブル", memberModel.Name);
                    Assert.AreEqual(8, memberModel.LineFrom);
                    Assert.AreEqual(8, memberModel.LineTo);
                }
            }
コード例 #20
0
            public void ParseFile_AnonymousStructures()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.AnonymousStructuresTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);

                    Assert.AreEqual(1, model.Classes.Count);

                    var classModel = model.Classes[0];

                    Assert.AreEqual(2, classModel.Members.Count);

                    var member = classModel.Members[0];
                    Assert.AreEqual("start", member.Name);
                    Assert.AreEqual(1, member.LineFrom);
                    Assert.AreEqual(1, member.LineTo);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    Assert.AreEqual("{x:Int, y:Int}", member.Type);

                    member = classModel.Members[1];
                    Assert.AreEqual("target", member.Name);
                    Assert.AreEqual(2, member.LineFrom);
                    Assert.AreEqual(2, member.LineTo);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    Assert.AreEqual("{x:Int, y:Int}", member.Type);
                }
            }
コード例 #21
0
        private void ExtractFilesFromArchive()
        {
            string[] masks = context.GetExplorerMask();
            for (int i = 0; i < masks.Length; i++)
                masks[i] = masks[i].Substring(masks[i].IndexOf('*') + 1);

            Stream fileStream = File.OpenRead(pathModel.Path);
            ZipFile zipFile = new ZipFile(fileStream);
            ASFileParser parser = new ASFileParser();
            Dictionary<string, FileModel> models = new Dictionary<string, FileModel>();

            foreach (ZipEntry entry in zipFile)
            {
                string ext = Path.GetExtension(entry.Name).ToLower();
                foreach (string mask in masks)
                    if (ext == mask)
                    {
                        string src = UnzipFile(zipFile, entry);
                        FileModel model = new FileModel(Path.Combine(pathModel.Path, entry.Name));
                        model.Context = pathModel.Owner;
                        parser.ParseSrc(model, src);
                        models.Add(model.FileName, model);
                    }
            }
            zipFile.Close();
            fileStream.Close();

            pathModel.SetFiles(models);
        }
コード例 #22
0
            public void ParseFile_ClassImplements()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.ImplementClassTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);

                    Assert.AreEqual(2, model.Classes.Count);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(Visibility.Public, classModel.Access);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.That(classModel.Implements, Is.EquivalentTo(new[] {"ITest"}));

                    classModel = model.Classes[1];
                    Assert.AreEqual("MultipleTest", classModel.Name);
                    Assert.AreEqual(Visibility.Public, classModel.Access);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.That(classModel.Implements, Is.EquivalentTo(new[] {"ITest", "ITest2", "ITest3"}));
                }
            }
コード例 #23
0
ファイル: ASFileParser.cs プロジェクト: thecocce/flashdevelop
 public QType QualifiedName(FileModel InFile, string Name)
 {
     var qt = new QType();
     var type = Name;
     if (InFile.Package == "") type = Name;
     else if (InFile.Module == "" || InFile.Module == Name) type = InFile.Package + "." + Name;
     else type = InFile.Package + "." + InFile.Module + "." + Name;
     qt.Type = type;
     int p = Name.IndexOf('<');
     if (p > 0)
     {
         qt.Template = Name.Substring(p);
         if (Name[p - 1] == '.') p--;
         qt.Name = Name.Substring(0, p);
     }
     else qt.Name = Name;
     return qt;
 }
コード例 #24
0
            public void ParseFile_Comments()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.CommentsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(1, model.Classes.Count);

                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual("\r * Some custom comments\r ", classModel.Comments);
                    Assert.AreEqual(5, classModel.LineFrom);
                    Assert.AreEqual(19, classModel.LineTo);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.Members.Count);
                    var member = classModel.Members[0];
                    Assert.AreEqual(10, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual("Test", member.Name);
                    Assert.AreEqual("Java Style comments", member.Comments);
                    Assert.AreEqual(FlagType.Constructor, member.Flags & FlagType.Constructor);
                    Assert.AreEqual(Visibility.Public, member.Access & Visibility.Public);
                    member = classModel.Members[1];
                    Assert.AreEqual(15, member.LineFrom);
                    Assert.AreEqual(18, member.LineTo);
                    Assert.AreEqual("testAdd", member.Name);
                    Assert.AreEqual("Int", member.Type);
                    Assert.AreEqual("\r\t * Some method documentation\r\t ", member.Comments);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual(Visibility.Public, member.Access & Visibility.Public);
                    Assert.AreEqual(2, member.Parameters.Count);
                }
            }
コード例 #25
0
ファイル: ASFileParser.cs プロジェクト: thecocce/flashdevelop
 /// <summary>
 /// Rebuild a file model with the source provided
 /// </summary>
 /// <param name="fileModel">Model</param>
 /// <param name="ba">Source</param>
 ///
 public void ParseSrc(FileModel fileModel, string ba)
 {
     ParseSrc(fileModel, ba, true);
 }
コード例 #26
0
            public void ParseFile_ComplexClass()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.ComplexClassTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.LineFrom);
                    Assert.AreEqual(49, classModel.LineTo);
                    Assert.AreEqual(15, classModel.Members.Count);

                    var memberModel = classModel.Members[0];
                    Assert.AreEqual("CONSTANT", memberModel.Name);
                    var flags = FlagType.Static | FlagType.Variable;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(4, memberModel.LineFrom);
                    Assert.AreEqual(4, memberModel.LineTo);

                    memberModel = classModel.Members[1];
                    Assert.AreEqual("id", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Variable;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(6, memberModel.LineFrom);
                    Assert.AreEqual(6, memberModel.LineTo);

                    memberModel = classModel.Members[2];
                    Assert.AreEqual("_name", memberModel.Name);
                    Assert.AreEqual("String", memberModel.Type);
                    flags = FlagType.Variable;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(8, memberModel.LineFrom);
                    Assert.AreEqual(8, memberModel.LineTo);

                    memberModel = classModel.Members[3];
                    Assert.AreEqual("ro", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Getter;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(10, memberModel.LineFrom);
                    Assert.AreEqual(10, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    Assert.AreEqual("default", memberModel.Parameters[0].Name);
                    Assert.AreEqual("null", memberModel.Parameters[1].Name);

                    memberModel = classModel.Members[4];
                    Assert.AreEqual("wo", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Getter;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(12, memberModel.LineFrom);
                    Assert.AreEqual(12, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    Assert.AreEqual("null", memberModel.Parameters[0].Name);
                    Assert.AreEqual("default", memberModel.Parameters[1].Name);

                    memberModel = classModel.Members[5];
                    Assert.AreEqual("x", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Getter;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(14, memberModel.LineFrom);
                    Assert.AreEqual(14, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    Assert.AreEqual("get", memberModel.Parameters[0].Name);
                    Assert.AreEqual("set", memberModel.Parameters[1].Name);

                    memberModel = classModel.Members[6];
                    Assert.AreEqual("get_x", memberModel.Name);
                    Assert.AreEqual(null, memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(15, memberModel.LineFrom);
                    Assert.AreEqual(18, memberModel.LineTo);
                    Assert.IsNull(memberModel.Parameters);

                    memberModel = classModel.Members[7];
                    Assert.AreEqual("set_x", memberModel.Name);
                    Assert.AreEqual(null, memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(19, memberModel.LineFrom);
                    Assert.AreEqual(22, memberModel.LineTo);
                    Assert.AreEqual(1, memberModel.Parameters.Count);
                    Assert.AreEqual("val", memberModel.Parameters[0].Name);
                    flags = FlagType.ParameterVar;
                    Assert.AreEqual(flags, memberModel.Parameters[0].Flags & flags);

                    memberModel = classModel.Members[8];
                    Assert.AreEqual("y", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Getter;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(24, memberModel.LineFrom);
                    Assert.AreEqual(24, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    Assert.AreEqual("get", memberModel.Parameters[0].Name);
                    Assert.AreEqual("never", memberModel.Parameters[1].Name);

                    memberModel = classModel.Members[9];
                    Assert.AreEqual("get_y", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(25, memberModel.LineFrom);
                    Assert.AreEqual(25, memberModel.LineTo);
                    Assert.IsNull(memberModel.Parameters);

                    memberModel = classModel.Members[10];
                    Assert.AreEqual("Test", memberModel.Name);
                    flags = FlagType.Function | FlagType.Constructor;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(27, memberModel.LineFrom);
                    Assert.AreEqual(29, memberModel.LineTo);
                    Assert.AreEqual(1, memberModel.Parameters.Count);
                    var param = memberModel.Parameters[0];
                    Assert.AreEqual("?ds", param.Name);
                    Assert.AreEqual("Iterable<String>", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);

                    memberModel = classModel.Members[11];
                    Assert.AreEqual("bar", memberModel.Name);
                    Assert.AreEqual("Void", memberModel.Type);
                    flags = FlagType.Static | FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access & Visibility.Private);
                    Assert.AreEqual(31, memberModel.LineFrom);
                    Assert.AreEqual(33, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    param = memberModel.Parameters[0];
                    Assert.AreEqual("s", param.Name);
                    Assert.AreEqual("String", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(31, param.LineFrom);
                    Assert.AreEqual(31, param.LineTo);
                    param = memberModel.Parameters[1];
                    Assert.AreEqual("v", param.Name);
                    Assert.AreEqual("Bool", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(31, param.LineFrom);
                    Assert.AreEqual(31, param.LineTo);

                    memberModel = classModel.Members[12];
                    Assert.AreEqual("foo", memberModel.Name);
                    Assert.AreEqual("Bool", memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(35, memberModel.LineFrom);
                    Assert.AreEqual(38, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    param = memberModel.Parameters[0];
                    Assert.AreEqual("?s", param.Name);
                    Assert.AreEqual("String", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(35, param.LineFrom);
                    Assert.AreEqual(35, param.LineTo);
                    param = memberModel.Parameters[1];
                    Assert.AreEqual("?v", param.Name);
                    Assert.AreEqual("Bool", param.Type);
                    Assert.AreEqual("true", param.Value);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(35, param.LineFrom);
                    Assert.AreEqual(35, param.LineTo);

                    memberModel = classModel.Members[13];
                    Assert.AreEqual("boz", memberModel.Name);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(40, memberModel.LineFrom);
                    Assert.AreEqual(44, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    param = memberModel.Parameters[0];
                    Assert.AreEqual("?s", param.Name);
                    Assert.AreEqual("String", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(40, param.LineFrom);
                    Assert.AreEqual(40, param.LineTo);
                    param = memberModel.Parameters[1];
                    Assert.AreEqual("?v", param.Name);
                    Assert.AreEqual("Bool", param.Type);
                    Assert.AreEqual("true", param.Value);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(41, param.LineFrom);
                    Assert.AreEqual(41, param.LineTo);

                    memberModel = classModel.Members[14];
                    Assert.AreEqual("nestedGenerics", memberModel.Name);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access & Visibility.Public);
                    Assert.AreEqual(46, memberModel.LineFrom);
                    Assert.AreEqual(48, memberModel.LineTo);
                    Assert.AreEqual(1, memberModel.Parameters.Count);
                    param = memberModel.Parameters[0];
                    Assert.AreEqual("s", param.Name);
                    Assert.AreEqual("Array<Array<Int>>", param.Type);
                    Assert.AreEqual(FlagType.ParameterVar, param.Flags & FlagType.ParameterVar);
                    Assert.AreEqual(46, param.LineFrom);
                    Assert.AreEqual(46, param.LineTo);
                }
            }
コード例 #27
0
ファイル: ASGenerator.cs プロジェクト: zaynyatyi/flashdevelop
        private static void ChangeConstructorDecl(ScintillaNet.ScintillaControl Sci, MemberModel member, ClassModel inClass)
        {
            int wordPos = Sci.WordEndPosition(Sci.CurrentPos, true);
            List<FunctionParameter> functionParameters = ParseFunctionParameters(Sci, wordPos);
            ASResult funcResult = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(Sci.CurrentPos, true));

            if (funcResult == null || funcResult.Type == null) return;
            if (funcResult.Type != null && !funcResult.Type.Equals(inClass))
            {
                AddLookupPosition();
                lookupPosition = -1;

                DockContent dc = ASContext.MainForm.OpenEditableDocument(funcResult.Type.InFile.FileName, true);
                Sci = ASContext.CurSciControl;

                FileModel fileModel = new FileModel(funcResult.Type.InFile.FileName);
                fileModel.Context = ASContext.Context;
                ASFileParser parser = new ASFileParser();
                parser.ParseSrc(fileModel, Sci.Text);

                foreach (ClassModel cm in fileModel.Classes)
                {
                    if (cm.QualifiedName.Equals(funcResult.Type.QualifiedName))
                    {
                        funcResult.Type = cm;
                        break;
                    }
                }

                inClass = funcResult.Type;
                ASContext.Context.UpdateContext(inClass.LineFrom);
            }

            foreach (MemberModel m in inClass.Members)
            {
                if ((m.Flags & FlagType.Constructor) > 0)
                {
                    funcResult.Member = m;
                    break;
                }
            }

            if (funcResult.Member == null) return;
            if (isHaxe) funcResult.Member.Name = "new";

            ChangeDecl(Sci, funcResult.Member, functionParameters);
        }
コード例 #28
0
            public void ParseFile_Enums()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.EnumsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    Assert.AreEqual(2, model.Classes.Count);

                    var simpleEnum = model.Classes[0];
                    Assert.AreEqual("SimpleEnum", simpleEnum.Name);
                    Assert.AreEqual(2, simpleEnum.LineFrom);
                    Assert.AreEqual(6, simpleEnum.LineTo);
                    Assert.AreEqual(FlagType.Enum, simpleEnum.Flags & FlagType.Enum);
                    Assert.AreEqual(3, simpleEnum.Members.Count);
                    var member = simpleEnum.Members[0];
                    Assert.AreEqual("Foo", member.Name);
                    Assert.AreEqual(3, member.LineFrom);
                    Assert.AreEqual(3, member.LineTo);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = simpleEnum.Members[1];
                    Assert.AreEqual("Bar", member.Name);
                    Assert.AreEqual(4, member.LineFrom);
                    Assert.AreEqual(4, member.LineTo);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);
                    member = simpleEnum.Members[2];
                    Assert.AreEqual("Baz", member.Name);
                    Assert.AreEqual(5, member.LineFrom);
                    Assert.AreEqual(5, member.LineTo);
                    Assert.AreEqual(FlagType.Variable, member.Flags & FlagType.Variable);

                    var complexEnum = model.Classes[1];
                    Assert.AreEqual("ComplexEnum", complexEnum.Name);
                    Assert.AreEqual(8, complexEnum.LineFrom);
                    Assert.AreEqual(11, complexEnum.LineTo);
                    Assert.AreEqual(FlagType.Enum, complexEnum.Flags & FlagType.Enum);
                    Assert.AreEqual(2, complexEnum.Members.Count);
                    member = complexEnum.Members[0];
                    Assert.AreEqual("IntEnum", member.Name);
                    Assert.AreEqual(9, member.LineFrom);
                    Assert.AreEqual(9, member.LineTo);
                    Assert.AreEqual("i", member.Parameters[0].Name);
                    Assert.AreEqual("Int", member.Parameters[0].Type);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    member = complexEnum.Members[1];
                    Assert.AreEqual("MultiEnum", member.Name);
                    Assert.AreEqual(10, member.LineFrom);
                    Assert.AreEqual(10, member.LineTo);
                    Assert.AreEqual(FlagType.Function, member.Flags & FlagType.Function);
                    Assert.AreEqual("i", member.Parameters[0].Name);
                    Assert.AreEqual("Int", member.Parameters[0].Type);
                    Assert.AreEqual("j", member.Parameters[1].Name);
                    Assert.AreEqual("String", member.Parameters[1].Type);
                    Assert.AreEqual("k", member.Parameters[2].Name);
                    Assert.AreEqual("Float", member.Parameters[2].Type);
                }
            }
コード例 #29
0
ファイル: ASGenerator.cs プロジェクト: zaynyatyi/flashdevelop
        private static void GenerateFunctionJob(GeneratorJobType job, ScintillaNet.ScintillaControl Sci, MemberModel member,
            bool detach, ClassModel inClass)
        {
            int position = 0;
            MemberModel latest = null;
            bool isOtherClass = false;

            Visibility funcVisi = job.Equals(GeneratorJobType.FunctionPublic) ? Visibility.Public : GetDefaultVisibility();
            int wordPos = Sci.WordEndPosition(Sci.CurrentPos, true);
            List<FunctionParameter> functionParameters = ParseFunctionParameters(Sci, wordPos);

            // evaluate, if the function should be generated in other class
            ASResult funcResult = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(Sci.CurrentPos, true));

            int contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(Sci.CurrentPos, true));
            MemberModel isStatic = new MemberModel();
            if (contextOwnerPos != -1)
            {
                ASResult contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos);
                if (contextOwnerResult != null)
                {
                    if (contextOwnerResult.Member == null && contextOwnerResult.Type != null)
                    {
                        isStatic.Flags |= FlagType.Static;
                    }
                }
            }
            else if (member != null && (member.Flags & FlagType.Static) > 0)
            {
                isStatic.Flags |= FlagType.Static;
            }


            if (funcResult.RelClass != null && !funcResult.RelClass.IsVoid() && !funcResult.RelClass.Equals(inClass))
            {
                AddLookupPosition();
                lookupPosition = -1;

                DockContent dc = ASContext.MainForm.OpenEditableDocument(funcResult.RelClass.InFile.FileName, true);
                Sci = ASContext.CurSciControl;
                isOtherClass = true;

                FileModel fileModel = new FileModel();
                fileModel.Context = ASContext.Context;
                ASFileParser parser = new ASFileParser();
                parser.ParseSrc(fileModel, Sci.Text);

                foreach (ClassModel cm in fileModel.Classes)
                {
                    if (cm.QualifiedName.Equals(funcResult.RelClass.QualifiedName))
                    {
                        funcResult.RelClass = cm;
                        break;
                    }
                }
                inClass = funcResult.RelClass;

                ASContext.Context.UpdateContext(inClass.LineFrom);
            }

            string blockTmpl = null;
            if ((isStatic.Flags & FlagType.Static) > 0)
            {
                blockTmpl = TemplateUtils.GetBoundary("StaticMethods");
            }
            else if ((funcVisi & Visibility.Public) > 0)
            {
                blockTmpl = TemplateUtils.GetBoundary("PublicMethods");
            }
            else
            {
                blockTmpl = TemplateUtils.GetBoundary("PrivateMethods");
            }
            latest = TemplateUtils.GetTemplateBlockMember(Sci, blockTmpl);
            if (latest == null || (!isOtherClass && member == null))
            {
                latest = GetLatestMemberForFunction(inClass, funcVisi, isStatic);

                // if we generate function in current class..
                if (!isOtherClass)
                {
                    MethodsGenerationLocations location = ASContext.CommonSettings.MethodsGenerationLocations;
                    if (member == null)
                    {
                        detach = false;
                        lookupPosition = -1;
                        position = Sci.WordStartPosition(Sci.CurrentPos, true);
                        Sci.SetSel(position, Sci.WordEndPosition(position, true));
                    }
                    else if (latest != null && location == MethodsGenerationLocations.AfterSimilarAccessorMethod)
                    {
                        position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1);
                        Sci.SetSel(position, position);
                    }
                    else
                    {
                        position = Sci.PositionFromLine(member.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1);
                        Sci.SetSel(position, position);
                    }
                }
                else // if we generate function in another class..
                {
                    if (latest != null)
                    {
                        position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1);
                    }
                    else
                    {
                        position = GetBodyStart(inClass.LineFrom, inClass.LineTo, Sci);
                        detach = false;
                    }
                    Sci.SetSel(position, position);
                }
            }
            else
            {
                position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1);
                Sci.SetSel(position, position);
            }

            // add imports to function argument types
            if (functionParameters.Count > 0)
            {
                List<string> l = new List<string>();
                foreach (FunctionParameter fp in functionParameters)
                {
                    try
                    {
                        l.Add(fp.paramQualType);
                    }
                    catch (Exception) { }
                }
                int o = AddImportsByName(l, Sci.LineFromPosition(position));
                position += o;
                if (latest == null)
                    Sci.SetSel(position, Sci.WordEndPosition(position, true));
                else
                    Sci.SetSel(position, position);
            }
            
            List<MemberModel> parameters = new List<MemberModel>();
            for (int i = 0; i < functionParameters.Count; i++)
            {
                string name = functionParameters[i].paramName;
                string type = functionParameters[i].paramType;
                parameters.Add(new MemberModel(name, type, FlagType.ParameterVar, 0));
            }
            MemberModel newMember = NewMember(contextToken, isStatic, FlagType.Function, funcVisi);
            newMember.Parameters = parameters;
            GenerateFunction(newMember, position, detach, inClass);
        }
コード例 #30
0
            public void ParseFile_FunctionTypesAsArguments()
            {
                using (var resourceFile = new TestFile("ASCompletion.Test_Files.parser.haxe.FunctionTypesAsArgumentsTest.hx"))
                {
                    var srcModel = new FileModel(resourceFile.DestinationFile);
                    srcModel.Context = new HaXeContext.Context(new HaXeContext.HaXeSettings());
                    var model = ASFileParser.ParseFile(srcModel);
                    var classModel = model.Classes[0];
                    Assert.AreEqual("Test", classModel.Name);
                    Assert.AreEqual(FlagType.Class, classModel.Flags & FlagType.Class);
                    Assert.AreEqual(2, classModel.LineFrom);
                    Assert.AreEqual(15, classModel.LineTo);
                    Assert.AreEqual(3, classModel.Members.Count);

                    var memberModel = classModel.Members[0];
                    Assert.AreEqual("func1", memberModel.Name);
                    Assert.AreEqual("Array<Dynamic>", memberModel.Type);
                    var flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access);
                    Assert.AreEqual(4, memberModel.LineFrom);
                    Assert.AreEqual(6, memberModel.LineTo);
                    Assert.AreEqual(1, memberModel.Parameters.Count);
                    Assert.AreEqual("arg", memberModel.Parameters[0].Name);
                    Assert.AreEqual("(Float->Int)->(Int->Array<Dynamic>)", memberModel.Parameters[0].Type);

                    memberModel = classModel.Members[1];
                    Assert.AreEqual("func2", memberModel.Name);
                    Assert.AreEqual(null, memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Public, memberModel.Access);
                    Assert.AreEqual(8, memberModel.LineFrom);
                    Assert.AreEqual(10, memberModel.LineTo);
                    Assert.AreEqual(2, memberModel.Parameters.Count);
                    Assert.AreEqual("arg1", memberModel.Parameters[0].Name);
                    Assert.AreEqual("Int->Void", memberModel.Parameters[0].Type);
                    Assert.AreEqual("arg2", memberModel.Parameters[1].Name);
                    Assert.AreEqual("Dynamic", memberModel.Parameters[1].Type);

                    memberModel = classModel.Members[2];
                    Assert.AreEqual("func3", memberModel.Name);
                    Assert.AreEqual("Int", memberModel.Type);
                    flags = FlagType.Function;
                    Assert.AreEqual(flags, memberModel.Flags & flags);
                    Assert.AreEqual(Visibility.Private, memberModel.Access);
                    Assert.AreEqual(12, memberModel.LineFrom);
                    Assert.AreEqual(14, memberModel.LineTo);
                    Assert.AreEqual(1, memberModel.Parameters.Count);
                    Assert.AreEqual("arg", memberModel.Parameters[0].Name);
                    Assert.AreEqual("Float", memberModel.Parameters[0].Type);
                }
            }
コード例 #31
0
ファイル: LibParser.cs プロジェクト: Neverbirth/flashdevelop
        private void ReadType(JsonReader reader)
        {
            // root/modules/types
            FileModel cFile;
            ClassModel cClass;
            cFile = new FileModel();
            cFile.HasPackage = true;
            cFile.Version = 3;
            cFile.Context = context;
            cClass = new ClassModel();
            cClass.Flags = FlagType.Class;
            MemberModel cDelegate = new MemberModel();
            List<string> names;

            string prop = null;
            while (reader.Read())
            {
                if (reader.Token == JsonToken.ObjectEnd) break;
                if (reader.Token == JsonToken.PropertyName) prop = reader.Value.ToString();
                else if (reader.Token == JsonToken.String)
                {
                    string val = reader.Value.ToString();
                    switch (prop)
                    {
                        case "name": cClass.Name = val; break;
                        case "source":
                            if (val.IndexOf('/') > 0) val = val.Substring(val.IndexOf('/') + 1);
                            cFile.FileName = path.Path + "::" + val;
                            break;
                        case "package":
                            if (val.ToLower() == "cocos2d") val = "cocos2d"; // random casing through source
                            cFile.Package = val; 
                            break;
                        case "baseType": cClass.ExtendsType = val; break;
                        case "delegateReturnType": cDelegate.Type = CleanType(val); break;
                        case "type":
                            switch (val)
                            {
                                case "CLASS": break;
                                case "INTERFACE": cClass.Flags |= FlagType.Interface; break;
                                case "STRUCT": cClass.Flags |= FlagType.Struct; break;
                                case "DELEGATE": cDelegate.Name = cClass.Name; break;
                            }
                            break;
                        case "docstring": cClass.Comments = ExtractDoc(val); break;
                    }
                }
                else if (reader.Token == JsonToken.ArrayStart)
                {
                    switch (prop)
                    {
                        case "classattributes": ReadAttributes(reader, cClass); break;
                        case "fields": ReadFields(reader, cClass); break;
                        case "methods": ReadMethods(reader, cClass); break;
                        case "properties": ReadProperties(reader, cClass); break;
                        case "metainfo": ReadMetas(reader, cClass); break;
                        case "imports": 
                            names = ReadNames(reader);
                            foreach (string name in names)
                                cFile.Imports.Add(new MemberModel(name, name, FlagType.Import, Visibility.Public)); 
                            break;
                        case "interfaces": ReadInterfaces(reader, cClass); break;
                        case "delegateTypes":
                            names = ReadNames(reader);
                            if (names.Count > 0)
                            {
                                cDelegate.Parameters = new List<MemberModel>();
                                foreach (string argType in names)
                                {
                                    cDelegate.Parameters.Add(
                                        new MemberModel("p" + cDelegate.Parameters.Count, argType, FlagType.ParameterVar, Visibility.Public));
                                }
                            }
                            break;
                        default: reader.SkipArray(); break;
                    }
                }
                else if (reader.Token == JsonToken.ObjectStart)
                {
                    switch (prop)
                    {
                        case "constructor": 
                            MemberModel ctor = ReadMethod(reader, cClass);
                            cClass.Constructor = ctor.Name;
                            break;
                        default: reader.SkipObject(); break;
                    }
                }
            }

            if (cFile.FileName == null) return;
            string key = cFile.FileName.ToUpper();
            if (files.ContainsKey(key)) cFile = files[key];
            else files.Add(key, cFile);

            if (cFile.Package.ToLower() == "system") // System classes tweaks
            {
                cFile.Package = "";
                if (cClass.Name == "Vector") cClass.Name = "Vector.<T>";
                if (cClass.Name == "Object") cClass.ExtendsType = "void";
            }
            if (cClass.Access == Visibility.Private) cClass.Access = Visibility.Public;

            if (cDelegate.Name != null)
            {
                if (cDelegate.Parameters == null) cDelegate.Parameters = new List<MemberModel>();
                cDelegate.Access = Visibility.Public;
                cDelegate.Flags = FlagType.Function | FlagType.Delegate;
                cDelegate.InFile = cFile;
                cDelegate.IsPackageLevel = true;
                cFile.Members.Add(cDelegate);
            }
            else
            {
                cClass.Type = CleanType(String.IsNullOrEmpty(cFile.Package) ? cClass.Name : cFile.Package + "." + cClass.Name);
                cClass.InFile = cFile;
                cFile.Classes.Add(cClass);
            }
        }
コード例 #32
0
ファイル: PathExplorer.cs プロジェクト: zvoronz/flashdevelop
        private bool ParseFoundFiles()
        {
            bool writeCache = false;

            // parse files
            int n = foundFiles.Count;

            NotifyProgress(String.Format(TextHelper.GetString("Info.Parsing"), n), 0, n);
            FileModel aFile = null;
            int       cpt   = 0;
            string    filename;

            for (int i = 0; i < n; i++)
            {
                if (stopExploration)
                {
                    return(writeCache);
                }
                // parse
                filename = foundFiles[i];
                if (!File.Exists(filename))
                {
                    continue;
                }
                if (pathModel.HasFile(filename))
                {
                    FileModel cachedModel = pathModel.GetFile(filename);
                    if (cachedModel.OutOfDate)
                    {
                        cachedModel.Check();
                        writeCache = true;
                    }
                    continue;
                }
                else
                {
                    writeCache = true;
                }

                aFile = GetFileModel(filename);

                if (aFile == null || pathModel.HasFile(filename))
                {
                    continue;
                }
                // store model
                if (aFile.Context.IsModelValid(aFile, pathModel))
                {
                    pathModel.AddFile(aFile);
                }
                aFile = null;
                cpt++;
                // update status
                if (stopExploration)
                {
                    return(writeCache);
                }
                if (i % 10 == 0)
                {
                    NotifyProgress(String.Format(TextHelper.GetString("Info.Parsing"), n), i, n);
                }
                Thread.Sleep(1);
            }
            return(writeCache);
        }