예제 #1
0
        private bool TryReadType(string memberName, SyntaxTree sourceAST, ref IMember parentMember)
        {
            //todo: we're not skipping comments in this code

            if (IsMemberExpected <Type>(parentMember) && TryReadElementString(memberName, false))
            {
                var remainingLine = FortranParseHelper.GetStringUptoEndOfLineOrBeginOfComment(streamReader.Text, streamReader.ReadIndex - 1);
                var skip          = false;

                if (remainingLine.IndexOf("(") >= 0)
                {
                    //type use, not a type declaration
                }
                else
                {
                    var indexOfDoubleDots = remainingLine.IndexOf("::");

                    if (indexOfDoubleDots >= 0)
                    {
                        streamReader.ReadIndex--; //read back one
                        streamReader.ReadIndex += indexOfDoubleDots + 2;
                        char c = streamReader.Text[streamReader.ReadIndex];
                        while (FortranParseHelper.IsWhiteSpace(c)) //skip whitespace
                        {
                            c = streamReader.Text[++streamReader.ReadIndex];
                        }
                    }
                    else
                    {
                        //expect whitespace
                        if (!FortranParseHelper.IsWhiteSpace(streamReader.Text[streamReader.ReadIndex - 1]))
                        {
                            skip = true;
                        }
                    }
                    if (!skip)
                    {
                        var name = streamReader.ReadElementName();
                        if (!String.IsNullOrEmpty(name))
                        {
                            OnMemberFound <Type>(ref parentMember, name, sourceAST);
                            return(true);
                        }
                    }
                }
            }
            return(TryReadEndOfMember <Type>(ref parentMember, memberName));
        }
예제 #2
0
        private bool TryReadEndOfMember <T>(ref IMember parentMember, string memberName)
        {
            if (!(parentMember is T))
            {
                return(false);
            }

            if (TryReadElementString("end " + memberName, true))
            {
                HandleEndOfMember(ref parentMember);
                return(true);
            }
            //endsubroutine (for example) without space is also valid f90:
            if (TryReadElementString("end" + memberName, true))
            {
                HandleEndOfMember(ref parentMember);
                return(true);
            }
            if (TryReadElementString("end", true))
            {
                var remainingLine = FortranParseHelper.GetStringUptoEndOfLineOrBeginOfComment(streamReader.Text, streamReader.ReadIndex);
                if (String.IsNullOrEmpty(remainingLine))
                {
                    HandleEndOfMember(ref parentMember);
                    return(true);
                }
                else
                {
                    var trimmedLine = remainingLine.TrimStart();
                    var charsToSkip = remainingLine.Length - trimmedLine.Length;
                    streamReader.ReadIndex += charsToSkip;

                    if (TryReadElementString(memberName, true))
                    {
                        HandleEndOfMember(ref parentMember);
                        return(true);
                    }
                }
            }
            return(false);
        }