Class AssignToReadOnlyPropertyDiagnostic
- All Implemented Interfaces:
BSLDiagnostic, BSLParserVisitor<ParseTree>, ParseTreeVisitor<ParseTree>
AccessMode.READ.
Источник информации о режиме доступа — синтакс-помощник платформы 1С
(через bsl-context) или JSON-fallback. Метаданные пробрасываются
платформенным провайдером в MemberDescriptor.metadata()
и индексируются TypeRegistry.indexMemberMetadata(TypeRef, Collection) как пары
(тип-владелец, имя свойства), что позволяет быстро отфильтровать
безопасные присваивания.
Поток:
TypeRegistry.hasAnyReadOnlyMember()— глобальный гейт. Без HBK / без accessMode-данных диагностика моментально no-op.TypeService.memberAt(com.github._1c_syntax.bsl.languageserver.context.DocumentContext, Position)— точный резолв member'а с учётом инференции типа ресивера (глобальное свойство, локальная переменная, цепочка аксессоров). Резолв bilingual: read-only находится независимо от того, на каком языке (ru/en) записано имя свойства.- Финальная проверка
member.metadata().accessMode() == READ.
Pre-filter по имени свойства намеренно отсутствует: одно и то же имя
(например, Ссылка) может быть read-only на одном типе и
read-write на другом, поэтому решение принимается только по
резолвленному member'у конкретного типа-владельца.
Lock contention. Раньше шаг 3 (memberAt → ExpressionTypeInferencer
→ ReferenceResolver → ServerContextProvider.getDocument) брал per-document
RWLock и конкурировал с populateContext (там WRITE). Сейчас
reference-finder'ы переведены на getDocumentNoLock (см.
com.github._1c_syntax.bsl.languageserver.references), поэтому
диагностика безопасно работает в фазу populate.
-
Field Summary
Fields inherited from class AbstractVisitorDiagnostic
diagnosticStorage, documentContext, info -
Constructor Summary
ConstructorsConstructorDescriptionAssignToReadOnlyPropertyDiagnostic(TypeRegistry typeRegistry, TypeService typeService) -
Method Summary
Modifier and TypeMethodDescriptionMethods inherited from class AbstractVisitorDiagnostic
getDiagnostics, getInfo, setInfoMethods inherited from class BSLParserBaseVisitor
visitAcceptor, visitAccessCall, visitAccessIndex, visitAccessProperty, visitAddHandlerStatement, visitAnnotation, visitAnnotationName, visitAnnotationParam, visitAnnotationParamName, visitAnnotationParams, visitAnnotationParamValue, visitBoolOperation, visitBreakStatement, visitCallParam, visitCallParamList, visitCallStatement, visitCodeBlock, visitCompareOperation, visitCompilerDirective, visitCompilerDirectiveSymbol, visitComplexIdentifier, visitCompoundStatement, visitConstValue, visitContinueStatement, visitDefaultValue, visitDoCall, visitElseBranch, visitElsifBranch, visitEvent, visitExceptCodeBlock, visitExecuteStatement, visitExpression, visitFile, visitFileCodeBlock, visitFileCodeBlockBeforeSub, visitForEachStatement, visitForStatement, visitFuncDeclaration, visitFunction, visitGlobalMethodCall, visitGotoStatement, visitHandler, visitIfBranch, visitIfStatement, visitIncompleteAccess, visitLabel, visitLabelName, visitLValue, visitMember, visitMethodCall, visitMethodName, visitModifier, visitModuleAnnotations, visitModuleVar, visitModuleVarDeclaration, visitModuleVars, visitModuleVarsList, visitMultilineString, visitNewExpression, visitNumeric, visitOperation, visitParam, visitParamList, visitPreproc_boolOperation, visitPreproc_else, visitPreproc_elsif, visitPreproc_endif, visitPreproc_expression, visitPreproc_if, visitPreproc_logicalExpression, visitPreproc_logicalOperand, visitPreproc_native, visitPreproc_stack, visitPreproc_symbol, visitPreproc_unknownSymbol, visitPreprocessor, visitProcDeclaration, visitProcedure, visitRaiseStatement, visitRegionEnd, visitRegionName, visitRegionStart, visitRemoveHandlerStatement, visitReturnStatement, visitShebang, visitStatement, visitString, visitSub, visitSubCodeBlock, visitSubName, visitSubs, visitSubVar, visitSubVarDeclaration, visitSubVars, visitSubVarsList, visitTernaryOperator, visitTryCodeBlock, visitTryStatement, visitTypeName, visitUnaryModifier, visitUse, visitUsedLib, visitVar_name, visitWaitExpression, visitWaitStatement, visitWhileStatementMethods inherited from class AbstractParseTreeVisitor
aggregateResult, defaultResult, shouldVisitNextChild, visit, visitChildren, visitErrorNode, visitTerminalMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface BSLDiagnostic
configureMethods inherited from interface ParseTreeVisitor
visit, visitChildren, visitErrorNode, visitTerminal
-
Constructor Details
-
AssignToReadOnlyPropertyDiagnostic
@ConstructorProperties({"typeRegistry","typeService"}) public AssignToReadOnlyPropertyDiagnostic(TypeRegistry typeRegistry, TypeService typeService)
-
-
Method Details
-
visitAssignment
- Specified by:
visitAssignmentin interfaceBSLParserVisitor<ParseTree>- Overrides:
visitAssignmentin classBSLParserBaseVisitor<ParseTree>
-