Skip to content

Commit

Permalink
we got him
Browse files Browse the repository at this point in the history
  • Loading branch information
Brat-vseznamus committed Jan 27, 2025
1 parent 52a92a2 commit 0b0bd17
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 22 deletions.
60 changes: 60 additions & 0 deletions internal/tlcodegen/qt_struct.qtpl
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{% package tlcodegen %}

{% import "fmt" %}
{% import "github.com/vkcom/tl/internal/utils" %}
{% import "strings" %}
{% import "sort" %}

{%- func (struct_ *TypeRWStruct)GenerateCode(bytesVersion bool, directImports *DirectImports) -%}
{%- code
Expand Down Expand Up @@ -794,6 +797,63 @@ func (item *{%s= goName %}) ReadResultJSONWriteResult(r []byte, w []byte) ([]byt
w, err = item.WriteResult(w, ret)
return r, w, err
}
{%- for fieldId, field := range struct_.Fields -%}
{%- if _, affectedBits := struct_.GetFieldNatPropertiesAsUsageMap(fieldId, false, true); len(affectedBits) != 0 -%}
{%- code
bits := make([]uint32, 0)
for i := range affectedBits {
bits = append(bits, i)
}
sort.Slice(bits, func(i, j int) bool {
return bits[i] < bits[j]
})
-%}
{%- for _, bit := range bits -%}
{%- code
bitUsage := affectedBits[bit]
affectedTypes := make([]*TypeRWStruct, 0)
for i := range bitUsage.AffectedFields {
affectedTypes = append(affectedTypes, i)
}
sort.Slice(affectedTypes, func(i, j int) bool {
return TypeRWWrapperLessGlobal(affectedTypes[i].wr, affectedTypes[j].wr) > 0
})
-%}
{%- for _, affectedType := range affectedTypes -%}
{%- code
affectedFieldsByBit := bitUsage.AffectedFields[affectedType]
affectedFieldsByBit = utils.SetToSlice(utils.SliceToSet(affectedFieldsByBit))
sort.Slice(affectedFieldsByBit, func(i, j int) bool {
return affectedFieldsByBit[i] < affectedFieldsByBit[j]
})
fieldNames := make([]string, len(affectedFieldsByBit))
fieldNamesForComment := make([]string, len(affectedFieldsByBit))

for i := range fieldNames {
fieldNames[i] = affectedType.Fields[affectedFieldsByBit[i]].goName
fieldNamesForComment[i] = "\"" + affectedType.Fields[affectedFieldsByBit[i]].originalName + "\""
}

mergedFields := strings.Join(fieldNames, "And")
mergedFieldsForComment := strings.Join(fieldNamesForComment, ", ")
maybeS := ""
if len(affectedFieldsByBit) > 1 {
maybeS = "s"
}
-%}
// Set field{%s= maybeS %} {%s= mergedFieldsForComment %} in "{%s= affectedType.wr.tlName.String() %}" by changing fieldMask "{%s= field.originalName %}"
func (item *{%s= goName %}) SetInReturn{%s= mergedFields %}For{%s= affectedType.wr.goGlobalName %}(value bool) {
if value {
item.{%s= field.goName %} |= 1 << {%d= int(bit) %}
} else {
item.{%s= field.goName %} &^= 1 << {%d= int(bit) %}
}
}

{%- endfor -%}
{%- endfor -%}
{%- endif -%}
{%- endfor -%}

{%- endfunc -%}

Expand Down
84 changes: 84 additions & 0 deletions internal/tlcodegen/qt_struct.qtpl.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 24 additions & 22 deletions internal/tlcodegen/type_rw_struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ const (
)

func (trw *TypeRWStruct) GetFieldNatProperties(fieldId int) (FieldNatProperties, []uint32) {
result, affectedIndexes := trw.GetFieldNatPropertiesAsUsageMap(fieldId)
result, affectedIndexes := trw.GetFieldNatPropertiesAsUsageMap(fieldId, true, true)
indexes := make([]uint32, 0)
for i := range affectedIndexes {
indexes = append(indexes, i)
Expand All @@ -293,7 +293,7 @@ func (trw *TypeRWStruct) GetFieldNatProperties(fieldId int) (FieldNatProperties,
return result, indexes
}

func (trw *TypeRWStruct) GetFieldNatPropertiesAsUsageMap(fieldId int) (FieldNatProperties, map[uint32]BitUsageInfo) {
func (trw *TypeRWStruct) GetFieldNatPropertiesAsUsageMap(fieldId int, inStruct, inReturnType bool) (FieldNatProperties, map[uint32]BitUsageInfo) {
if fieldId < 0 || len(trw.Fields) <= fieldId {
return FieldIsNotNat, nil
}
Expand All @@ -305,32 +305,34 @@ func (trw *TypeRWStruct) GetFieldNatPropertiesAsUsageMap(fieldId int) (FieldNatP
result := FieldIsNat
affectedIndexes := make(map[uint32]BitUsageInfo)
natParamUsageMap := make(map[VisitedTypeNatParam]VisitResult)
for i, f := range trw.Fields {
if i == fieldId {
continue
}
if f.fieldMask != nil &&
f.fieldMask.isField &&
f.fieldMask.FieldIndex == fieldId {
if _, hasBit := affectedIndexes[f.BitNumber]; !hasBit {
affectedIndexes[f.BitNumber] = BitUsageInfo{AffectedFields: map[*TypeRWStruct][]int{}}
if inStruct {
for i, f := range trw.Fields {
if i == fieldId {
continue
}
affectedIndexes[f.BitNumber].AffectedFields[trw] = append(affectedIndexes[f.BitNumber].AffectedFields[trw], i)
if f.fieldMask != nil &&
f.fieldMask.isField &&
f.fieldMask.FieldIndex == fieldId {
if _, hasBit := affectedIndexes[f.BitNumber]; !hasBit {
affectedIndexes[f.BitNumber] = BitUsageInfo{AffectedFields: map[*TypeRWStruct][]int{}}
}
affectedIndexes[f.BitNumber].AffectedFields[trw] = append(affectedIndexes[f.BitNumber].AffectedFields[trw], i)

result |= FieldUsedAsFieldMask
}
natIndexes := make([]int, 0)
for j, natArg := range f.natArgs {
if natArg.isField && natArg.FieldIndex == fieldId {
natIndexes = append(natIndexes, j)
result |= FieldUsedAsFieldMask
}
natIndexes := make([]int, 0)
for j, natArg := range f.natArgs {
if natArg.isField && natArg.FieldIndex == fieldId {
natIndexes = append(natIndexes, j)
}
}
for _, j := range natIndexes {
visit(f.t, j, &natParamUsageMap, &affectedIndexes, &result)
}
}
for _, j := range natIndexes {
visit(f.t, j, &natParamUsageMap, &affectedIndexes, &result)
}
}

if trw.ResultType != nil {
if inReturnType && (trw.ResultType != nil) {
for j, natArg := range trw.ResultNatArgs {
if natArg.isField && natArg.FieldIndex == fieldId {
visit(trw.ResultType, j, &natParamUsageMap, &affectedIndexes, &result)
Expand Down

0 comments on commit 0b0bd17

Please sign in to comment.