private void defineClassDestructor(DestructorDeclarationNode destructorDeclaration, TypeBuilder typeBuilder) { if (typeBuilder.IsEnum) { // TODO: error } var methodBuilder = (MethodBuilder)typeBuilder.getMethod("finalize", Query.empty<TypeInfo>()); if (methodBuilder != null) { context.addError(CompileErrorId.AlreadyDefinedDestructor, destructorDeclaration, BytecodeHelper.getDisplayName(typeBuilder)); } var name = context.getIdentifier(destructorDeclaration.NameOffset, destructorDeclaration.NameLength); if (!name.equals(typeBuilder.Name)) { context.addError(CompileErrorId.InvalidDestructorName, destructorDeclaration, name); } methodBuilder = typeBuilder.defineMethod("finalize"); methodBuilder.setReturnType(context.TypeSystem.VoidType); methodBuilder.setProtected(true); destructorDeclaration.addUserData(methodBuilder); }
private ITypeMember parseDestructorDeclaration(List<AnnotationSectionNode> annotations, EnumSet<Modifier> modifiers) { if (!isIdentifier(lexicalUnit)) { throw error(ParseErrorId.IdentifierExpected); } var declaration = new DestructorDeclarationNode { NameOffset = scanner.StartPosition, NameLength = getLexicalUnitLength() }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); if (nextLexicalUnit(true) != LexicalUnit.OpenParenthesis) { throw error(ParseErrorId.OpenParenthesisExpected); } if (nextLexicalUnit(true) != LexicalUnit.CloseParenthesis) { throw error(ParseErrorId.CloseParenthesisExpected); } nextLexicalUnit(true); switch (lexicalUnit) { case OpenBrace: declaration.Body = parseBlockStatement(); declaration.EndPosition = declaration.Body.EndPosition; break; case SemiColon: declaration.EndPosition = scanner.StartPosition; docCommentEndPosition = 0; nextLexicalUnit(true); break; default: throw error(ParseErrorId.OpenBraceExpected); } return declaration; }