private static string GetFieldValue(IBuffer buffer, YamlLexer lexer, string name) { SkipWhitespaceAndNewLine(lexer); var currentToken = lexer.TokenType; if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var text = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); if (!text.Equals(name)) { return(null); } } lexer.Advance(); SkipWhitespaceAndNewLine(lexer); currentToken = lexer.TokenType; if (currentToken != YamlTokenType.COLON) { return(null); } lexer.Advance(); SkipWhitespaceAndNewLine(lexer); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var text = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); lexer.Advance(); return(text); } return(null); }
private static void FillTargetAndMethod(IBuffer buffer, OneToSetMap <string, FileID> eventHandlerToScriptTarget) { var lexer = new YamlLexer(buffer, false, false); lexer.Start(); TokenNodeType currentToken; FileID currentTarget = null; string currentMethod = null; while ((currentToken = lexer.TokenType) != null) { if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var text = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); lexer.Advance(); SkipWhitespace(lexer); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.COLON) { if (text.Equals("m_Target")) { if (currentMethod != null && currentTarget != null) { eventHandlerToScriptTarget.Add(currentMethod, currentTarget); } lexer.Advance(); currentTarget = GetFileId(buffer, lexer); } else if (text.Equals("m_MethodName")) { Assertion.Assert(currentTarget != null, "currentTarget != null"); lexer.Advance(); currentMethod = GetPrimitiveValue(buffer, lexer); } } } lexer.Advance(); } if (currentMethod != null && currentTarget != null) { eventHandlerToScriptTarget.Add(currentMethod, currentTarget); } }
public static FileID GetFileId(IBuffer buffer) { var lexer = new YamlLexer(buffer, false, false); lexer.Start(); if (lexer.TokenType == YamlTokenType.INDENT) { lexer.Advance(); } SkipWhitespaceAndNewLine(lexer); if (lexer.TokenType == YamlTokenType.LBRACE) { lexer.Advance(); return(GetFileIdInner(buffer, lexer)); } return(null); }
public static FileID GetFileId(IBuffer buffer, YamlLexer lexer) { SkipWhitespaceAndNewLine(lexer); if (lexer.TokenType == YamlTokenType.LBRACE) { lexer.Advance(); return(GetFileIdInner(buffer, lexer)); } return(null); }
private static void SkipWhitespaceAndNewLine(YamlLexer lexer) { while (true) { var tokenType = lexer.TokenType; if (tokenType == null || tokenType != YamlTokenType.WHITESPACE && tokenType != YamlTokenType.NEW_LINE) { return; } lexer.Advance(); } }
public static void SkipWhitespace(YamlLexer lexer) { while (true) { var tokenType = lexer.TokenType; if (tokenType == null || tokenType != YamlTokenType.WHITESPACE) { return; } lexer.Advance(); } }
public static bool FindNextIndent(YamlLexer lexer) { while (true) { var tokenType = lexer.TokenType; if (tokenType == null) { return(false); } if (tokenType == YamlTokenType.INDENT) { return(true); } lexer.Advance(); } }
public static FileID GetFileIdInner(IBuffer buffer, YamlLexer lexer) { var fileId = GetFieldValue(buffer, lexer, "fileID"); if (fileId == null) { return(null); } SkipWhitespace(lexer); if (lexer.TokenType != YamlTokenType.COMMA) { return(new FileID(null, fileId)); } lexer.Advance(); var guid = GetFieldValue(buffer, lexer, "guid"); return(new FileID(guid, fileId)); }
public static void ExtractSimpleAndReferenceValues(IBuffer buffer, Dictionary <string, string> simpleValues, Dictionary <string, FileID> referenceValues) { // special field for accessing anchor id simpleValues["&anchor"] = GetAnchorFromBuffer(buffer); var lexer = new YamlLexer(buffer, true, false); lexer.Start(); TokenNodeType currentToken; bool noColon = true; while ((currentToken = lexer.TokenType) != null) { if (noColon) { if (currentToken == YamlTokenType.COLON) { noColon = false; } if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_OUT) { var key = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); // special filed for checking stripped documents if (key.Equals("stripped")) { simpleValues["stripped"] = "1"; } } } if (currentToken == YamlTokenType.INDENT) { lexer.Advance(); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var key = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); lexer.Advance(); SkipWhitespace(lexer); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.COLON) { lexer.Advance(); SkipWhitespace(lexer); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.LBRACE) { lexer.Advance(); var result = GetFileIdInner(buffer, lexer); if (result != null) { referenceValues[key] = result; } } else if (YamlTokenType.CHAMELEON_BLOCK_MAPPING_ENTRY_CONTENT_WITH_ANY_INDENT.Equals(currentToken)) { // sometimes, FileId is multiline var result = GetFileId(ProjectedBuffer.Create(buffer, new TextRange(lexer.TokenStart, lexer.TokenEnd))); if (result != null) { referenceValues[key] = result; } } else { var result = GetPrimitiveValue(buffer, lexer); if (result != null) { simpleValues[key] = result; } } } } else { FindNextIndent(lexer); } } else { lexer.Advance(); } } }
/// <summary> /// This method skips m_Modifications entry in prefab document and stores modifications in dictionaries /// /// After this method is executed, lexer current token is null or indent of next entry (after m_Modifications) /// </summary> private void GetModifications(IBuffer buffer, YamlLexer lexer, int parentIndentSize, Dictionary <FileID, string> names, Dictionary <FileID, int?> rootIndexes) { FileID curTarget = null; string curPropertyPath = null; string curValue = null; // Each property modifications is flow node: // - target: .. // propertyPath: .. // value: // Minus token means that new modification description is started // There are several entries in description. We are interested only // in target, propertyPath and value while (UnitySceneDataUtil.FindNextIndent(lexer)) { var currentSize = lexer.TokenEnd - lexer.TokenStart; lexer.Advance(); var tokenType = lexer.TokenType; if (tokenType == YamlTokenType.MINUS) { currentSize++; AddData(); lexer.Advance(); } if (currentSize <= parentIndentSize) { break; } UnitySceneDataUtil.SkipWhitespace(lexer); tokenType = lexer.TokenType; if (tokenType == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var text = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); if (text.Equals(UnityYamlConstants.TargetProperty)) { lexer.Advance(); UnitySceneDataUtil.SkipWhitespace(lexer); lexer.Advance(); // skip column // [TODO] handle prefab in prefab curTarget = UnitySceneDataUtil.GetFileId(buffer, lexer).WithGuid(null); } else if (text.Equals(UnityYamlConstants.PropertyPathProperty)) { lexer.Advance(); UnitySceneDataUtil.SkipWhitespace(lexer); lexer.Advance(); curPropertyPath = UnitySceneDataUtil.GetPrimitiveValue(buffer, lexer); } else if (text.Equals(UnityYamlConstants.ValueProperty)) { lexer.Advance(); UnitySceneDataUtil.SkipWhitespace(lexer); lexer.Advance(); curValue = UnitySceneDataUtil.GetPrimitiveValue(buffer, lexer); } } } AddData(); void AddData() { if (curTarget != null) { if (curPropertyPath != null && curPropertyPath.Equals(UnityYamlConstants.NameProperty)) { names[curTarget] = curValue; } else if (curPropertyPath != null && curPropertyPath.Equals(UnityYamlConstants.RootOrderProperty)) { rootIndexes[curTarget] = int.TryParse(curValue, out var r) ? (int?)r : null; } curTarget = null; curPropertyPath = null; curValue = null; } } }
public void AddPrefabModification(IBuffer buffer) { var anchor = UnitySceneDataUtil.GetAnchorFromBuffer(buffer); if (anchor == null) { return; } var lexer = new YamlLexer(buffer, false, false); lexer.Start(); TokenNodeType currentToken; var transformParentId = FileID.Null; while ((currentToken = lexer.TokenType) != null) { if (currentToken == YamlTokenType.INDENT) { var indentSize = lexer.TokenEnd - lexer.TokenStart; lexer.Advance(); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.NS_PLAIN_ONE_LINE_IN) { var text = buffer.GetText(new TextRange(lexer.TokenStart, lexer.TokenEnd)); if (text.Equals(UnityYamlConstants.TransformParentProperty)) { lexer.Advance(); UnitySceneDataUtil.SkipWhitespace(lexer); currentToken = lexer.TokenType; if (currentToken == YamlTokenType.COLON) { lexer.Advance(); var result = UnitySceneDataUtil.GetFileId(buffer, lexer); if (result != null) { transformParentId = result; } } } else if (text.Equals(UnityYamlConstants.ModificationsProperty)) { var names = new Dictionary <FileID, string>(); var rootIndexes = new Dictionary <FileID, int?>(); GetModifications(buffer, lexer, indentSize, names, rootIndexes); var id = new FileID(null, anchor); Elements.Add(id, new ModificationHierarchyElement(id, null, null, false, transformParentId, rootIndexes, names)); return; } } } else { lexer.Advance(); } } }