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)); }
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); }