blob: 2183c953800b31f4068e1d7d26192652c87c891c [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"fmt"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufanalysis"
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/protosource"
)
// Helper is a helper for rules.
type Helper struct {
id string
ignoreFunc IgnoreFunc
fileAnnotations []bufanalysis.FileAnnotation
}
// NewHelper returns a new Helper for the given id.
func NewHelper(id string, ignoreFunc IgnoreFunc) *Helper {
return &Helper{
id: id,
ignoreFunc: ignoreFunc,
}
}
// AddFileAnnotationf adds a FileAnnotation with the id as the Type.
//
// If descriptor is nil, no filename information is added.
// If location is nil, no line or column information will be added.
func (h *Helper) AddFileAnnotationf(
descriptor protosource.Descriptor,
location protosource.Location,
format string,
args ...interface{},
) {
h.addFileAnnotationf(
descriptor,
nil,
location,
nil,
format,
args...,
)
}
// AddFileAnnotationWithExtraIgnoreDescriptorsf adds a FileAnnotation with the id as the Type.
//
// extraIgnoreDescriptors are extra desciptors to check for ignores.
//
// If descriptor is nil, no filename information is added.
// If location is nil, no line or column information will be added.
func (h *Helper) AddFileAnnotationWithExtraIgnoreDescriptorsf(
descriptor protosource.Descriptor,
extraIgnoreDescriptors []protosource.Descriptor,
location protosource.Location,
format string,
args ...interface{},
) {
h.addFileAnnotationf(
descriptor,
extraIgnoreDescriptors,
location,
nil,
format,
args...,
)
}
// AddFileAnnotationWithExtraIgnoreLocationsf adds a FileAnnotation with the id as the Type.
//
// extraIgnoreLocations are extra locations to check for comment ignores.
//
// If descriptor is nil, no filename information is added.
// If location is nil, no line or column information will be added.
func (h *Helper) AddFileAnnotationWithExtraIgnoreLocationsf(
descriptor protosource.Descriptor,
location protosource.Location,
extraIgnoreLocations []protosource.Location,
format string,
args ...interface{},
) {
h.addFileAnnotationf(
descriptor,
nil,
location,
extraIgnoreLocations,
format,
args...,
)
}
func (h *Helper) addFileAnnotationf(
descriptor protosource.Descriptor,
extraIgnoreDescriptors []protosource.Descriptor,
location protosource.Location,
extraIgnoreLocations []protosource.Location,
format string,
args ...interface{},
) {
if h.ignoreFunc != nil && h.ignoreFunc(
h.id,
append([]protosource.Descriptor{descriptor}, extraIgnoreDescriptors...),
append([]protosource.Location{location}, extraIgnoreLocations...),
) {
return
}
h.fileAnnotations = append(
h.fileAnnotations,
newFileAnnotationf(
h.id,
descriptor,
location,
format,
args...,
),
)
}
// FileAnnotations returns the added FileAnnotations.
func (h *Helper) FileAnnotations() []bufanalysis.FileAnnotation {
return h.fileAnnotations
}
// newFileAnnotationf adds a FileAnnotation with the id as the Type.
//
// If descriptor is nil, no filename information is added.
// If location is nil, no line or column information will be added.
func newFileAnnotationf(
id string,
descriptor protosource.Descriptor,
location protosource.Location,
format string,
args ...interface{},
) bufanalysis.FileAnnotation {
startLine := 0
startColumn := 0
endLine := 0
endColumn := 0
if location != nil {
startLine = location.StartLine()
startColumn = location.StartColumn()
endLine = location.EndLine()
endColumn = location.EndColumn()
}
var fileInfo bufanalysis.FileInfo
if descriptor != nil {
fileInfo = descriptor.File()
}
return bufanalysis.NewFileAnnotation(
fileInfo,
startLine,
startColumn,
endLine,
endColumn,
id,
fmt.Sprintf(format, args...),
)
}