protected override void VisitClassDefinition(ClassDefinitionNode classDefinitionNode) { string className = classDefinitionNode.NameNode.Value; ClassSymbol classSymbol = new ClassSymbol(className, classDefinitionNode); AddSymbol(classSymbol); Visit(classDefinitionNode.AttributeNodes); }
protected override void VisitClassDefinition(ClassDefinitionNode node) { string classNameUpper = node.NameNode.Value.ToUpper(); int offset = 0; if (Class2Offset.ContainsKey(classNameUpper)) { offset = Class2Offset[classNameUpper]; } int size = 0; foreach (DeclarationNode attributeNode in node.AttributeNodes) { if (attributeNode.Symbol is AttributeSymbol attributeSymbol) { attributeSymbol.Offset = offset + size; } if (attributeNode is VarArrayDeclarationNode varArrayDeclarationNode) { NodeValue arraySizeValue = varArrayDeclarationNode.ArraySizeValue; if (arraySizeValue is IntValue intValue) { size += (attributeNode.Symbol.BuiltinType == SymbolType.String ? 20 : 4) * Convert.ToInt32(intValue.Value); } else { return; } } else { size += (attributeNode.Symbol.BuiltinType == SymbolType.String ? 20 : 4); } } if (node.Symbol is ClassSymbol classSymbol) { classSymbol.Offset = offset; classSymbol.Size = size; classSymbol.AttributesCount = node.AttributeNodes.Count; } if (Class2RequiredSize.ContainsKey(classNameUpper)) { long requiredSize = Class2RequiredSize[classNameUpper]; if (size != requiredSize) { node.Annotations.Add(new WrongClassSizeError(node.NameNode.Location, node.NameNode.Value, size, requiredSize)); } } }
protected virtual T VisitClassDefinition(ClassDefinitionNode node) { Visit(node.AttributeNodes); return(DefaultResult); }
protected virtual void VisitClassDefinition(ClassDefinitionNode node) { Visit(node.AttributeNodes); }