2025-10-15 10:12:44 +03:00

98 lines
2.7 KiB
Go

package checker
import (
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/diagnostics"
)
func (c *Checker) checkUnmatchedJSDocParameters(node *ast.Node) {
var jsdocParameters []*ast.Node
for _, tag := range getAllJSDocTags(node) {
if tag.Kind == ast.KindJSDocParameterTag {
name := tag.AsJSDocParameterOrPropertyTag().Name()
if ast.IsIdentifier(name) && len(name.Text()) == 0 {
continue
}
jsdocParameters = append(jsdocParameters, tag)
}
}
if len(jsdocParameters) == 0 {
return
}
isJs := ast.IsInJSFile(node)
parameters := collections.Set[string]{}
excludedParameters := collections.Set[int]{}
for i, param := range node.Parameters() {
name := param.AsParameterDeclaration().Name()
if ast.IsIdentifier(name) {
parameters.Add(name.Text())
}
if ast.IsBindingPattern(name) {
excludedParameters.Add(i)
}
}
if c.containsArgumentsReference(node) {
if isJs {
lastJSDocParamIndex := len(jsdocParameters) - 1
lastJSDocParam := jsdocParameters[lastJSDocParamIndex].AsJSDocParameterOrPropertyTag()
if lastJSDocParam == nil || !ast.IsIdentifier(lastJSDocParam.Name()) {
return
}
if excludedParameters.Has(lastJSDocParamIndex) || parameters.Has(lastJSDocParam.Name().Text()) {
return
}
if lastJSDocParam.TypeExpression == nil || lastJSDocParam.TypeExpression.Type() == nil {
return
}
if c.isArrayType(c.getTypeFromTypeNode(lastJSDocParam.TypeExpression.Type())) {
return
}
c.error(lastJSDocParam.Name(), diagnostics.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_had_an_array_type, lastJSDocParam.Name().Text())
}
} else {
for index, tag := range jsdocParameters {
name := tag.AsJSDocParameterOrPropertyTag().Name()
isNameFirst := tag.AsJSDocParameterOrPropertyTag().IsNameFirst
if excludedParameters.Has(index) || (ast.IsIdentifier(name) && parameters.Has(name.Text())) {
continue
}
if ast.IsQualifiedName(name) {
if isJs {
c.error(name, diagnostics.Qualified_name_0_is_not_allowed_without_a_leading_param_object_1,
entityNameToString(name),
entityNameToString(name.AsQualifiedName().Left),
)
}
} else {
if !isNameFirst {
c.errorOrSuggestion(isJs, name,
diagnostics.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name,
name.Text(),
)
}
}
}
}
}
func getAllJSDocTags(node *ast.Node) []*ast.Node {
if node == nil {
return nil
}
jsdocs := node.JSDoc(nil)
if len(jsdocs) == 0 {
return nil
}
lastJSDoc := jsdocs[len(jsdocs)-1].AsJSDoc()
if lastJSDoc.Tags == nil {
return nil
}
return lastJSDoc.Tags.Nodes
}