Skip to content

Commit cb922b8

Browse files
committed
опция для проверки вложенных вызовов
1 parent 69eac62 commit cb922b8

File tree

6 files changed

+74
-16
lines changed

6 files changed

+74
-16
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnostic.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.github._1c_syntax.bsl.languageserver.context.symbol.ModuleSymbol;
2525
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
26+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter;
2627
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope;
2728
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
2829
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
@@ -49,18 +50,18 @@
4950
)
5051
@RequiredArgsConstructor
5152
public class PrivilegedModuleMethodCallDiagnostic extends AbstractDiagnostic {
53+
54+
private static final boolean VALIDATE_NESTED_CALLS = true;
55+
56+
@DiagnosticParameter(
57+
type = Boolean.class,
58+
defaultValue = "" + VALIDATE_NESTED_CALLS
59+
)
60+
private boolean validateNestedCalls = VALIDATE_NESTED_CALLS;
61+
5262
private final ReferenceIndex referenceIndex;
5363
private List<ModuleSymbol> privilegedModuleSymbols = new ArrayList<>();
5464

55-
private static boolean isReferenceToModules(Reference reference, List<ModuleSymbol> privilegedModuleSymbols) {
56-
return reference.getSourceDefinedSymbol()
57-
.flatMap(sourceDefinedSymbol -> sourceDefinedSymbol.getRootParent(SymbolKind.Module))
58-
.filter(ModuleSymbol.class::isInstance)
59-
.map(ModuleSymbol.class::cast)
60-
.filter(privilegedModuleSymbols::contains)
61-
.isPresent();
62-
}
63-
6465
@Override
6566
protected void check() {
6667
if (privilegedModuleSymbols.isEmpty()){
@@ -71,7 +72,7 @@ protected void check() {
7172
}
7273

7374
referenceIndex.getReferencesFrom(documentContext.getUri(), SymbolKind.Method).stream()
74-
.filter(reference -> isReferenceToModules(reference, privilegedModuleSymbols))
75+
.filter(this::isReferenceToModules)
7576
.forEach(this::fireIssue);
7677
}
7778

@@ -89,6 +90,18 @@ private Optional<ModuleSymbol> getPrivilegedModuleSymbol(MDCommonModule mdCommon
8990
.map(documentContext1 -> documentContext1.getSymbolTree().getModule());
9091
}
9192

93+
private boolean isReferenceToModules(Reference reference) {
94+
if (!validateNestedCalls && reference.getUri().equals(documentContext.getUri())){
95+
return false;
96+
}
97+
return reference.getSourceDefinedSymbol()
98+
.flatMap(sourceDefinedSymbol -> sourceDefinedSymbol.getRootParent(SymbolKind.Module))
99+
.filter(ModuleSymbol.class::isInstance)
100+
.map(ModuleSymbol.class::cast)
101+
.filter(privilegedModuleSymbols::contains)
102+
.isPresent();
103+
}
104+
92105
private void fireIssue(Reference reference) {
93106
diagnosticStorage.addDiagnostic(reference.getSelectionRange(),
94107
info.getMessage(reference.getSymbol().getName()));

src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,14 @@
14781478
"object"
14791479
],
14801480
"title": "Accessing privileged module methods",
1481+
"properties": {
1482+
"validateNestedCalls": {
1483+
"description": "Validate nested method calls from privileged modules",
1484+
"default": true,
1485+
"type": "boolean",
1486+
"title": "Validate nested method calls from privileged modules"
1487+
}
1488+
},
14811489
"$id": "#/definitions/PrivilegedModuleMethodCall"
14821490
},
14831491
"ProcedureReturnsValue": {
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
diagnosticMessage=Check the %s method access of the privileged module
2-
diagnosticName=Accessing privileged module methods
2+
diagnosticName=Accessing privileged module methods
3+
validateNestedCalls=Validate nested method calls from privileged modules
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
diagnosticMessage=Проверьте обращение к методу %s привилегированного модуля
22
diagnosticName=Обращение к методам привилегированных модулей
3+
validateNestedCalls=Проверять вложенные вызовы методов из привилегированных модулей

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnosticTest.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,34 @@
2424
import org.eclipse.lsp4j.Diagnostic;
2525
import org.junit.jupiter.api.Test;
2626

27+
import java.nio.file.Path;
28+
import java.nio.file.Paths;
2729
import java.util.List;
30+
import java.util.Map;
2831

2932
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;
33+
import static org.mockito.Mockito.spy;
34+
import static org.mockito.Mockito.when;
3035

3136
class PrivilegedModuleMethodCallDiagnosticTest extends AbstractDiagnosticTest<PrivilegedModuleMethodCallDiagnostic> {
3237
private static final String PATH_TO_METADATA = "src/test/resources/metadata/privilegedModules";
38+
private static final String PATH_TO_MODULE_FILE = PATH_TO_METADATA + "/CommonModules/ПривилегированныйМодуль1/Ext/Module.bsl";
3339

3440
PrivilegedModuleMethodCallDiagnosticTest() {
3541
super(PrivilegedModuleMethodCallDiagnostic.class);
3642
}
3743

44+
@Test
45+
void testWithoutMetadata() {
46+
var diagnostics = getDiagnostics();
47+
assertThat(diagnostics).isEmpty();
48+
}
49+
3850
@Test
3951
void test() {
4052
initServerContext(PATH_TO_METADATA);
4153

42-
List<Diagnostic> diagnostics = getDiagnostics();
54+
var diagnostics = getDiagnostics();
4355

4456
assertThat(diagnostics).hasSize(2);
4557
assertThat(diagnostics, true)
@@ -48,9 +60,32 @@ void test() {
4860
}
4961

5062
@Test
51-
void testWithoutMetadata() {
63+
void getNestedCalls() {
64+
var diagnostics = getDiagnosticsAsCommonModule();
65+
assertThat(diagnostics).hasSize(2);
66+
assertThat(diagnostics, true)
67+
.hasMessageOnRange("Проверьте обращение к методу ПубличнаяФункция привилегированного модуля", 15, 15, 31)
68+
.hasMessageOnRange("Проверьте обращение к методу ПубличнаяПроцедура привилегированного модуля", 19, 4, 22);
69+
}
5270

53-
List<Diagnostic> diagnostics = getDiagnostics();
71+
@Test
72+
void testParameterValidateNestedCalls() {
73+
Map<String, Object> configuration = diagnosticInstance.getInfo().getDefaultConfiguration();
74+
configuration.put("validateNestedCalls", false);
75+
diagnosticInstance.configure(configuration);
76+
77+
var diagnostics = getDiagnosticsAsCommonModule();
5478
assertThat(diagnostics).isEmpty();
5579
}
80+
81+
private List<Diagnostic> getDiagnosticsAsCommonModule() {
82+
Path moduleFile = Paths.get(PATH_TO_MODULE_FILE).toAbsolutePath();
83+
84+
initServerContext(PATH_TO_METADATA);
85+
86+
var documentContext = spy(getDocumentContext(diagnosticInstance.getClass().getSimpleName()));
87+
when(documentContext.getUri()).thenReturn(moduleFile.toUri());
88+
89+
return getDiagnostics(documentContext);
90+
}
5691
}

src/test/resources/metadata/privilegedModules/CommonModules/ПривилегированныйМодуль1/Ext/Module.bsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
#Область СлужебныеПроцедурыИФункции
1414

1515
Функция ПриватнаяФункция()
16-
16+
Значение = ПубличнаяФункция();
1717
КонецФункции
1818

1919
Процедура ПриватнаяПроцедура()
20-
20+
ПубличнаяПроцедура();
2121
КонецПроцедуры
2222

2323
#КонецОбласти

0 commit comments

Comments
 (0)