private void defineInterfaceProperty(PropertyDeclarationNode propertyDeclaration, TypeBuilder typeBuilder) { defineTypeProperty(propertyDeclaration, typeBuilder); }
private void defineTypeProperty(PropertyDeclarationNode propertyDeclaration, TypeBuilder typeBuilder) { var isInterface = typeBuilder.IsInterface; var name = context.getIdentifier(propertyDeclaration.NameOffset, propertyDeclaration.NameLength); foreach (var meth in typeBuilder.Methods) { foreach (var ann in meth.Annotations) { if (BytecodeHelper.isPropertyGet(ann)) { if (BytecodeHelper.getPropertyGetName(meth, ann).equals(name)) { context.addError(CompileErrorId.AlreadyDefinedProperty, propertyDeclaration, BytecodeHelper.getDisplayName(typeBuilder), name); } } else if (BytecodeHelper.isPropertySet(ann)) { if (BytecodeHelper.getPropertySetName(meth, ann).equals(name)) { context.addError(CompileErrorId.AlreadyDefinedProperty, propertyDeclaration, BytecodeHelper.getDisplayName(typeBuilder), name); } } } } var type = CompilerHelper.resolveTypeReference(context, typeBuilder.PackageName, propertyDeclaration.Type); var get = propertyDeclaration.GetAccessor; var set = propertyDeclaration.SetAccessor; if (!isInterface) { checkAccessors(propertyDeclaration.Modifiers, get, set, propertyDeclaration); } if (get != null) { var methodName = "get" + name; if (type.IsBoolean) { if (name.length() > 2 && name.startsWith("Is") && Character.isUpperCase(name[2])) { methodName = Character.toLowerCase(name[0]) + name.substring(1); } } var methodBuilder = typeBuilder.defineMethod(methodName); get.addUserData(methodBuilder); if (isInterface) { methodBuilder.setAbstract(true); methodBuilder.setPublic(true); } else { setPropertyOrIndexerModifiers(get, propertyDeclaration.getModifiers(), methodBuilder); } methodBuilder.setReturnType(type); methodBuilder.addAnnotation(context.getType("stab/lang/PropertyGet", get), false); } if (set != null) { var methodBuilder = typeBuilder.defineMethod("set" + name); set.addUserData(methodBuilder); if (isInterface) { methodBuilder.setAbstract(true); methodBuilder.setPublic(true); } else { setPropertyOrIndexerModifiers(set, propertyDeclaration.getModifiers(), methodBuilder); } methodBuilder.setReturnType(context.TypeSystem.VoidType); var paramBuilder = methodBuilder.addParameter(type); paramBuilder.setName("value"); methodBuilder.addAnnotation(context.getType("stab/lang/PropertySet", set), false); } }
private ITypeMember parseFieldOrPropertyOrMethod(List<AnnotationSectionNode> annotations, EnumSet<Modifier> modifiers, bool partial, TypeReferenceNode type, int startPosition) { if (!isIdentifier(lexicalUnit)) { throw error(ParseErrorId.IdentifierExpected); } int sp = scanner.StartPosition; int len = getLexicalUnitLength(); saveScannerState(); var typeParameters = new ArrayList<SimpleNameTypeReferenceNode>(); nextLexicalUnit(true); parseTypeParameters(typeParameters); Modifier setterAccess = checkSetterAccess(); bool forceAsField = false; if (lexicalUnit == LexicalUnit.Multiply) { forceAsField = true; nextLexicalUnit(true); } switch (lexicalUnit) { case OpenParenthesis: if (setterAccess != Modifier.Public || forceAsField) { throw error(ParseErrorId.IdentifierExpected); } var methodDeclaration = new MethodDeclarationNode { IsPartial = partial, ReturnType = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { methodDeclaration.DocumentationOffset = docCommentStartPosition; methodDeclaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(methodDeclaration); methodDeclaration.Modifiers.addAll(modifiers); methodDeclaration.Annotations.addAll(annotations); foreach (var t in typeParameters) { if (t.TypeReferenceKind != TypeReferenceKind.SimpleName || t.TypeArguments.size() > 0) { throw error(ParseErrorId.SimpleNameExpected); } methodDeclaration.TypeParameters.add((SimpleNameTypeReferenceNode)t); } if (nextLexicalUnit(true) != LexicalUnit.CloseParenthesis) { parseFormalParameters(methodDeclaration.Parameters, LexicalUnit.CloseParenthesis); } else { nextLexicalUnit(true); } parseTypeParameterConstraintsClauses(methodDeclaration.ConstraintsClauses); switch (lexicalUnit) { case OpenBrace: methodDeclaration.Body = parseBlockStatement(); methodDeclaration.EndPosition = methodDeclaration.Body.EndPosition; break; case SemiColon: methodDeclaration.EndPosition = scanner.EndPosition; nextLexicalUnit(true); break; default: throw error(ParseErrorId.OpenBraceExpected); } return methodDeclaration; case OpenBrace: if (setterAccess != Modifier.Public || forceAsField) { throw error(ParseErrorId.IdentifierExpected); } var propertyDeclaration = new PropertyDeclarationNode { Type = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { propertyDeclaration.DocumentationOffset = docCommentStartPosition; propertyDeclaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(propertyDeclaration); propertyDeclaration.Modifiers.addAll(modifiers); nextLexicalUnit(true); parseAccessorDeclaration(propertyDeclaration, false); if (lexicalUnit != LexicalUnit.CloseBrace) { parseAccessorDeclaration(propertyDeclaration, false); } docCommentEndPosition = 0; propertyDeclaration.EndPosition = scanner.EndPosition; nextLexicalUnit(false); return propertyDeclaration; case Assign: { if (setterAccess != Modifier.Public || forceAsField) { throw error(ParseErrorId.IdentifierExpected); } var declaration = new FieldDeclarationNode { Type = type, StartPosition = startPosition }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); nextLexicalUnit(true); var decl = new VariableDeclaratorNode { NameOffset = sp, NameLength = len }; setSavedScannerState(decl); decl.Value = parseFieldInitializer(); decl.EndPosition = decl.Value.EndPosition; declaration.Declarators.add(decl); while (lexicalUnit == LexicalUnit.Comma) { if (!isIdentifier(nextLexicalUnit(true))) { throw error(ParseErrorId.IdentifierExpected); } decl = new VariableDeclaratorNode { NameOffset = scanner.StartPosition, NameLength = getLexicalUnitLength() }; setScannerState(decl); decl.EndPosition = scanner.EndPosition; declaration.Declarators.add(decl); if (nextLexicalUnit(true) == LexicalUnit.Assign) { nextLexicalUnit(true); decl.Value = parseFieldInitializer(); decl.EndPosition = decl.Value.EndPosition; } } docCommentEndPosition = 0; declaration.EndPosition = parseSemiColon(false, false); return declaration; } case Comma: { if (setterAccess != Modifier.Public || forceAsField) { throw error(ParseErrorId.IdentifierExpected); } var declaration = new FieldDeclarationNode { Type = type, StartPosition = startPosition }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); var decl = new VariableDeclaratorNode { NameOffset = sp, NameLength = len }; setSavedScannerState(decl); decl.EndPosition = sp + len; declaration.Declarators.add(decl); do { if (!isIdentifier(nextLexicalUnit(true))) { throw error(ParseErrorId.IdentifierExpected); } decl = new VariableDeclaratorNode { NameOffset = scanner.StartPosition, NameLength = getLexicalUnitLength() }; setScannerState(decl); declaration.Declarators.add(decl); decl.EndPosition = scanner.EndPosition; if (nextLexicalUnit(true) == LexicalUnit.Assign) { nextLexicalUnit(true); decl.Value = parseFieldInitializer(); decl.EndPosition = decl.Value.EndPosition; } } while (lexicalUnit == LexicalUnit.Comma); docCommentEndPosition = 0; declaration.EndPosition = parseSemiColon(false, false); return declaration; } case SemiColon: { if ((modifiers.contains(Modifier.Public) || modifiers.contains(Modifier.Protected)) && !forceAsField) { var propertyShortDeclaration = new PropertyDeclarationNode { Type = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { propertyShortDeclaration.DocumentationOffset = docCommentStartPosition; propertyShortDeclaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(propertyShortDeclaration); propertyShortDeclaration.Modifiers.addAll(modifiers); fakeParseShortProperty(propertyShortDeclaration, setterAccess, false); docCommentEndPosition = 0; propertyShortDeclaration.EndPosition = scanner.EndPosition; nextLexicalUnit(false); return propertyShortDeclaration; } var declaration = new FieldDeclarationNode { Type = type, StartPosition = startPosition }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); var decl = new VariableDeclaratorNode { NameOffset = sp, NameLength = len }; setSavedScannerState(decl); decl.EndPosition = sp + len; declaration.Declarators.add(decl); docCommentEndPosition = 0; declaration.EndPosition = scanner.EndPosition; nextLexicalUnit(false); return declaration; } default: throw error(ParseErrorId.UnexpectedLexicalUnit); } }
public void enterPropertySetter(PropertyDeclarationNode declaration) { methodInfos.add(declaration.SetAccessor.getUserData(typeof(MethodInfo))); }
private IInterfaceMember parseInterfaceMember(List<AnnotationSectionNode> annotations, EnumSet<Modifier> modifiers, int startPosition) { var type = parseType(true, true); if (lexicalUnit == LexicalUnit.Keyword && scanner.Keyword == Keyword.This) { saveScannerState(); nextLexicalUnit(true); return parseIndexerDeclaration(annotations, modifiers, false, type, true, startPosition); } if (!isIdentifier(lexicalUnit)) { throw error(ParseErrorId.IdentifierExpected); } int sp = scanner.StartPosition; int len = getLexicalUnitLength(); saveScannerState(); var lexicalUnitShorter = nextLexicalUnit(true); if (lexicalUnitShorter == LexicalUnit.OpenBrace) { var declaration = new PropertyDeclarationNode { Type = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); nextLexicalUnit(true); parseAccessorDeclaration(declaration, true); if (lexicalUnit != LexicalUnit.CloseBrace) { parseAccessorDeclaration(declaration, true); } declaration.EndPosition = scanner.EndPosition; nextLexicalUnit(false); return declaration; } Modifier setterAccess = Modifier.Public; if (lexicalUnitShorter == LexicalUnit.Xor) { setterAccess = Modifier.Private; lexicalUnitShorter = nextLexicalUnit(true); } if (lexicalUnitShorter == LexicalUnit.SemiColon) { var propertyShortDeclaration = new PropertyDeclarationNode { Type = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { propertyShortDeclaration.DocumentationOffset = docCommentStartPosition; propertyShortDeclaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(propertyShortDeclaration); propertyShortDeclaration.Modifiers.addAll(modifiers); propertyShortDeclaration.Annotations.addAll(annotations); fakeParseShortProperty(propertyShortDeclaration, setterAccess, true); docCommentEndPosition = 0; propertyShortDeclaration.EndPosition = scanner.EndPosition; nextLexicalUnit(false); return propertyShortDeclaration; } var declaration = new MethodDeclarationNode { ReturnType = type, NameOffset = sp, NameLength = len, StartPosition = startPosition }; if (docCommentEndPosition > 0) { declaration.DocumentationOffset = docCommentStartPosition; declaration.DocumentationLength = docCommentEndPosition - docCommentStartPosition; docCommentEndPosition = 0; } setSavedScannerState(declaration); declaration.Modifiers.addAll(modifiers); declaration.Annotations.addAll(annotations); parseTypeParameters(declaration.TypeParameters); if (lexicalUnit != LexicalUnit.OpenParenthesis) { throw error(ParseErrorId.OpenParenthesisExpected); } if (nextLexicalUnit(true) != LexicalUnit.CloseParenthesis) { parseFormalParameters(declaration.Parameters, LexicalUnit.CloseParenthesis); } else { nextLexicalUnit(true); } if (lexicalUnit == LexicalUnit.Assign) { nextLexicalUnit(true); declaration.DefaultValue = parseAnnotationValue(); } else { parseTypeParameterConstraintsClauses(declaration.ConstraintsClauses); } docCommentEndPosition = 0; declaration.EndPosition = parseSemiColon(false, false); return declaration; }