fmt: fix interface fields alignment (#19866)

This commit is contained in:
Felipe Pena 2023-11-15 13:17:35 -03:00 committed by GitHub
parent 915ac4ed4f
commit 83b4167c19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 318 additions and 252 deletions

View file

@ -424,7 +424,7 @@ pub interface JS.TypedArray {
mut: mut:
byteLength JS.Number byteLength JS.Number
byteOffset JS.Number byteOffset JS.Number
length JS.Number length JS.Number
} }
pub interface JS.Uint8Array { pub interface JS.Uint8Array {

View file

@ -16,7 +16,7 @@ pub fn panic(s string) {
pub interface IError { pub interface IError {
// >> Hack to allow old style custom error implementations // >> Hack to allow old style custom error implementations
// TODO: remove once deprecation period for `IError` methods has ended // TODO: remove once deprecation period for `IError` methods has ended
msg string msg string
code int // << code int // <<
msg() string msg() string
code() int code() int

View file

@ -7,7 +7,7 @@ module builtin
pub interface IError { pub interface IError {
// >> Hack to allow old style custom error implementations // >> Hack to allow old style custom error implementations
// TODO: remove once deprecation period for `IError` methods has ended // TODO: remove once deprecation period for `IError` methods has ended
msg string msg string
code int // << code int // <<
msg() string msg() string
code() int code() int

View file

@ -17,12 +17,12 @@ pub fn (settings CanvasRenderingContext2DSettings) to_js() JS.Any {
pub interface JS.DOMMatrix2DInit { pub interface JS.DOMMatrix2DInit {
mut: mut:
a JS.Number a JS.Number
b JS.Number b JS.Number
c JS.Number c JS.Number
d JS.Number d JS.Number
e JS.Number e JS.Number
f JS.Number f JS.Number
m11 JS.Number m11 JS.Number
m12 JS.Number m12 JS.Number
m21 JS.Number m21 JS.Number
@ -48,7 +48,7 @@ mut:
} }
pub interface JS.DOMMatrix { pub interface JS.DOMMatrix {
is2D JS.Boolean is2D JS.Boolean
isIdentity JS.Boolean isIdentity JS.Boolean
flipX() JS.DOMMatrix flipX() JS.DOMMatrix
flipY() JS.DOMMatrix flipY() JS.DOMMatrix
@ -71,12 +71,12 @@ pub interface JS.DOMMatrix {
scaleSelf(scaleX JS.Number, scaleY JS.Number, scaleZ JS.Number, originX JS.Number, originY JS.Number, originZ JS.Number) JS.DOMMatrix scaleSelf(scaleX JS.Number, scaleY JS.Number, scaleZ JS.Number, originX JS.Number, originY JS.Number, originZ JS.Number) JS.DOMMatrix
toString() JS.String toString() JS.String
mut: mut:
a JS.Number a JS.Number
b JS.Number b JS.Number
c JS.Number c JS.Number
d JS.Number d JS.Number
e JS.Number e JS.Number
f JS.Number f JS.Number
m11 JS.Number m11 JS.Number
m12 JS.Number m12 JS.Number
m13 JS.Number m13 JS.Number
@ -128,14 +128,14 @@ pub fn JS.DOMQuad.fromRect(other JS.DOMRect) JS.DOMRect
pub interface JS.DOMRect { pub interface JS.DOMRect {
bottom JS.Number bottom JS.Number
left JS.Number left JS.Number
right JS.Number right JS.Number
top JS.Number top JS.Number
mut: mut:
height JS.Number height JS.Number
width JS.Number width JS.Number
x JS.Number x JS.Number
y JS.Number y JS.Number
} }
@[use_new] @[use_new]
@ -182,17 +182,17 @@ pub interface JS.EventTarget {
pub interface JS.Node { pub interface JS.Node {
JS.EventTarget JS.EventTarget
baseURI JS.String baseURI JS.String
childNodes JS.Any childNodes JS.Any
firstChild JS.ChildNode firstChild JS.ChildNode
isConnected JS.Boolean isConnected JS.Boolean
lastChild JS.ChildNode lastChild JS.ChildNode
nextSibling JS.ChildNode nextSibling JS.ChildNode
nodeName JS.String nodeName JS.String
nodeType JS.Number nodeType JS.Number
ownerDocument JS.Document ownerDocument JS.Document
parentElement JS.HTMLElement parentElement JS.HTMLElement
parentNode JS.ParentNode parentNode JS.ParentNode
previousSibling JS.ChildNode previousSibling JS.ChildNode
appendChild(node JS.Node) JS.Node appendChild(node JS.Node) JS.Node
cloneNode(deep JS.Boolean) JS.Node cloneNode(deep JS.Boolean) JS.Node
@ -208,7 +208,7 @@ pub interface JS.Node {
removeChild(child JS.Node) JS.Node removeChild(child JS.Node) JS.Node
replaceChild(node JS.Node, child JS.Node) JS.Npde replaceChild(node JS.Node, child JS.Node) JS.Npde
mut: mut:
nodeValue JS.String nodeValue JS.String
textContent JS.String textContent JS.String
} }
@ -223,32 +223,32 @@ pub interface JS.ChildNode {
pub interface JS.ParentNode { pub interface JS.ParentNode {
JS.Node JS.Node
childElementCount JS.Number childElementCount JS.Number
children JS.HTMLCollection children JS.HTMLCollection
} }
pub type WindowProxy = JS.Window pub type WindowProxy = JS.Window
pub interface JS.Document { pub interface JS.Document {
JS.Node JS.Node
all JS.HTMLAllCollection all JS.HTMLAllCollection
anchros JS.HTMLCollection anchros JS.HTMLCollection
applets JS.HTMLCollection applets JS.HTMLCollection
characterSet JS.String characterSet JS.String
charset JS.String charset JS.String
compatMode JS.String compatMode JS.String
contentType JS.String contentType JS.String
documentURI JS.String documentURI JS.String
documentElement JS.HTMLElement documentElement JS.HTMLElement
hidden JS.Boolean hidden JS.Boolean
head JS.HTMLHeadElement head JS.HTMLHeadElement
fullscreenEnabled JS.Boolean fullscreenEnabled JS.Boolean
fullscreen JS.Boolean fullscreen JS.Boolean
lastModified JS.String lastModified JS.String
inputEncoding JS.String inputEncoding JS.String
implementation JS.DOMImplementation implementation JS.DOMImplementation
doctype JS.DocumentType doctype JS.DocumentType
embeds JS.HTMLCollection embeds JS.HTMLCollection
forms JS.HTMLCollection forms JS.HTMLCollection
getElementById(id JS.String) ?JS.HTMLElement getElementById(id JS.String) ?JS.HTMLElement
adoptNode(node JS.Node) JS.Node adoptNode(node JS.Node) JS.Node
close() close()
@ -277,13 +277,13 @@ pub interface JS.Document {
requestPointerLock() requestPointerLock()
requestFullScreen() JS.Promise requestFullScreen() JS.Promise
mut: mut:
bgColor JS.String bgColor JS.String
fgColor JS.String fgColor JS.String
body JS.HTMLElement body JS.HTMLElement
cookie JS.String cookie JS.String
domain JS.String domain JS.String
designMode JS.String designMode JS.String
dir JS.String dir JS.String
vlinkColor JS.String vlinkColor JS.String
} }
@ -296,19 +296,19 @@ pub fn document_url(doc JS.Document) JS.String {
pub interface JS.Element { pub interface JS.Element {
JS.Node JS.Node
classList JS.DOMTokenList classList JS.DOMTokenList
clientHeight JS.Number clientHeight JS.Number
clientLeft JS.Number clientLeft JS.Number
clientTop JS.Number clientTop JS.Number
clientWidth JS.Number clientWidth JS.Number
localName JS.String localName JS.String
namespaceURI JS.String namespaceURI JS.String
ownerDocument JS.Document ownerDocument JS.Document
part JS.DOMTokenList part JS.DOMTokenList
prefix JS.String prefix JS.String
scrollHeight JS.Number scrollHeight JS.Number
scrollWidth JS.Number scrollWidth JS.Number
tagName JS.String tagName JS.String
closest(selector JS.String) ?JS.Element closest(selector JS.String) ?JS.Element
getAttribute(qualifiedName JS.String) ?JS.String getAttribute(qualifiedName JS.String) ?JS.String
getAttributeNS(namespace JS.String, localName JS.String) ?JS.String getAttributeNS(namespace JS.String, localName JS.String) ?JS.String
@ -328,14 +328,14 @@ pub interface JS.Element {
hasPointerCapture(pointerId JS.Number) JS.Boolean hasPointerCapture(pointerId JS.Number) JS.Boolean
matches(selectors JS.String) JS.Boolean matches(selectors JS.String) JS.Boolean
mut: mut:
className JS.String className JS.String
id JS.String id JS.String
onfullscreenchange fn (this JS.Element, ev JS.Event) JS.Any onfullscreenchange fn (this JS.Element, ev JS.Event) JS.Any
onfullscreenerror fn (this JS.Element, ev JS.Event) JS.Any onfullscreenerror fn (this JS.Element, ev JS.Event) JS.Any
outerHTML JS.String outerHTML JS.String
scrollLeft JS.Number scrollLeft JS.Number
scrollTop JS.Number scrollTop JS.Number
slot JS.String slot JS.String
} }
pub const ( pub const (
@ -374,24 +374,24 @@ pub interface JS.HTMLCollection {
pub interface JS.HTMLElement { pub interface JS.HTMLElement {
JS.Element JS.Element
accessKeyLabel JS.String accessKeyLabel JS.String
offsetHeight JS.Number offsetHeight JS.Number
offsetLeft JS.Number offsetLeft JS.Number
offsetParent JS.Any offsetParent JS.Any
offsetTop JS.Number offsetTop JS.Number
offsetWidth JS.Number offsetWidth JS.Number
click() click()
mut: mut:
accessKey JS.String accessKey JS.String
autocapitalize JS.String autocapitalize JS.String
dir JS.String dir JS.String
draggable JS.Boolean draggable JS.Boolean
hidden JS.Boolean hidden JS.Boolean
innerText JS.String innerText JS.String
lang JS.String lang JS.String
outerText JS.String outerText JS.String
spellcheck JS.Boolean spellcheck JS.Boolean
title JS.String title JS.String
translate JS.Boolean translate JS.Boolean
} }
pub fn JS.HTMLElement.prototype.constructor() JS.HTMLElement pub fn JS.HTMLElement.prototype.constructor() JS.HTMLElement
@ -399,10 +399,10 @@ pub fn JS.HTMLElement.prototype.constructor() JS.HTMLElement
pub interface JS.HTMLEmbedElement { pub interface JS.HTMLEmbedElement {
getSVGDocument() ?JS.Document getSVGDocument() ?JS.Document
mut: mut:
align JS.String align JS.String
height JS.String height JS.String
src JS.String src JS.String
width JS.String width JS.String
} }
pub fn html_embed_type(embed JS.HTMLEmbedElement) JS.String { pub fn html_embed_type(embed JS.HTMLEmbedElement) JS.String {
@ -423,7 +423,7 @@ pub interface JS.HTMLCanvasElement {
getContext(contextId JS.String, options JS.Any) ?CanvasContext getContext(contextId JS.String, options JS.Any) ?CanvasContext
mut: mut:
height JS.Number height JS.Number
width JS.Number width JS.Number
} }
pub type FillStyle = JS.CanvasGradient | JS.CanvasPattern | JS.String pub type FillStyle = JS.CanvasGradient | JS.CanvasPattern | JS.String
@ -464,16 +464,16 @@ pub interface JS.CanvasRenderingContext2D {
stroke() stroke()
fillText(text JS.String, x JS.Number, y JS.Number) fillText(text JS.String, x JS.Number, y JS.Number)
mut: mut:
lineCap JS.String lineCap JS.String
lineDashOffset JS.Number lineDashOffset JS.Number
lineJoin JS.String lineJoin JS.String
lineWidth JS.Number lineWidth JS.Number
miterLimit JS.Number miterLimit JS.Number
fillStyle FillStyle fillStyle FillStyle
strokeStyle FillStyle strokeStyle FillStyle
globalAlpha JS.Number globalAlpha JS.Number
globalCompositeOperation JS.String globalCompositeOperation JS.String
font JS.String font JS.String
} }
pub interface JS.CanvasGradient { pub interface JS.CanvasGradient {
@ -512,21 +512,21 @@ pub type AnimationFrameCallback = fn (JS.Number)
pub interface JS.Window { pub interface JS.Window {
JS.EventTarget JS.EventTarget
closed JS.Boolean closed JS.Boolean
devicePixelRatio JS.Number devicePixelRatio JS.Number
document JS.Document document JS.Document
frameElement JS.Element frameElement JS.Element
innerHeight JS.Number innerHeight JS.Number
innerWidth JS.Number innerWidth JS.Number
length JS.Number length JS.Number
outerHeight JS.Number outerHeight JS.Number
outerWidth JS.Number outerWidth JS.Number
screenLeft JS.Number screenLeft JS.Number
screenTop JS.Number screenTop JS.Number
screenX JS.Number screenX JS.Number
screenY JS.Number screenY JS.Number
scrollX JS.Number scrollX JS.Number
scrollY JS.Number scrollY JS.Number
alert(message JS.Any) alert(message JS.Any)
blur() blur()
cancelIdleCallback(handle JS.Number) cancelIdleCallback(handle JS.Number)
@ -546,9 +546,9 @@ pub interface JS.Window {
scrollTo(x JS.Number, y JS.Number) scrollTo(x JS.Number, y JS.Number)
requestAnimationFrame(callback AnimationFrameCallback) requestAnimationFrame(callback AnimationFrameCallback)
mut: mut:
name string name string
opener JS.Any opener JS.Any
ondevicemotion OnDeviceMotion ondevicemotion OnDeviceMotion
ondeviceorientation OnDeviceOrientation ondeviceorientation OnDeviceOrientation
} }
@ -568,27 +568,27 @@ pub struct JS.DeviceMotionEventRotationRate {
pub interface JS.DeviceMotionEvent { pub interface JS.DeviceMotionEvent {
JS.Event JS.Event
interval JS.Number interval JS.Number
acceleration JS.DeviceMotionEventAcceleration acceleration JS.DeviceMotionEventAcceleration
accelerationIncludingGravity JS.DeviceMotionEventAcceleration accelerationIncludingGravity JS.DeviceMotionEventAcceleration
rotationRate JS.DeviceMotionEventRotationRate rotationRate JS.DeviceMotionEventRotationRate
} }
pub interface JS.DeviceOrientationEvent { pub interface JS.DeviceOrientationEvent {
JS.Event JS.Event
absolute JS.Boolean absolute JS.Boolean
alpha JS.Number alpha JS.Number
beta JS.Number beta JS.Number
gamma JS.Number gamma JS.Number
} }
pub interface JS.DocumentType { pub interface JS.DocumentType {
JS.Node JS.Node
JS.ChildNode JS.ChildNode
name JS.String name JS.String
ownerDocument JS.Document ownerDocument JS.Document
publicId JS.String publicId JS.String
systemId JS.String systemId JS.String
} }
@[single_impl] @[single_impl]
@ -616,9 +616,9 @@ pub interface JS.WebGLUniformLocation {}
pub interface JS.WebGLVertexArrayObject {} pub interface JS.WebGLVertexArrayObject {}
pub interface JS.WebGLRenderingContext { pub interface JS.WebGLRenderingContext {
canvas JS.HTMLCanvasElement canvas JS.HTMLCanvasElement
drawingBufferHeight JS.Number drawingBufferHeight JS.Number
drawingBufferWidth JS.Number drawingBufferWidth JS.Number
activeTexture(texture JS.Number) activeTexture(texture JS.Number)
attachShader(program JS.WebGLProgram, shader JS.WebGLProgram) attachShader(program JS.WebGLProgram, shader JS.WebGLProgram)
linkProgram(program JS.WebGLProgram) linkProgram(program JS.WebGLProgram)
@ -811,15 +811,15 @@ pub fn gl_depth_test() JS.Number {
// Event is an event which takes place in the DOM. // Event is an event which takes place in the DOM.
pub interface JS.Event { pub interface JS.Event {
JS.EventTarget JS.EventTarget
bubbles JS.Boolean bubbles JS.Boolean
cancelable JS.Boolean cancelable JS.Boolean
composed JS.Boolean composed JS.Boolean
currentTarget JS.EventTarget currentTarget JS.EventTarget
defaultPrevented JS.Boolean defaultPrevented JS.Boolean
eventPhase JS.Number eventPhase JS.Number
isTrusted JS.Boolean isTrusted JS.Boolean
srcElement JS.EventTarget srcElement JS.EventTarget
timeStamp JS.DOMHighResTimeStamp // composedPath returns the invocation target objects of event's path. timeStamp JS.DOMHighResTimeStamp // composedPath returns the invocation target objects of event's path.
composedPath() JS.Array composedPath() JS.Array
initEvent(typ JS.String, bubbles JS.Boolean, cancelable JS.Boolean) initEvent(typ JS.String, bubbles JS.Boolean, cancelable JS.Boolean)
preventDefault() preventDefault()
@ -845,11 +845,11 @@ pub fn create_event(typ string, bubbles bool, cancelable bool, composed bool) JS
pub interface JS.ErrorEvent { pub interface JS.ErrorEvent {
JS.Event JS.Event
colno JS.Number colno JS.Number
error JS.Number error JS.Number
filename JS.Number filename JS.Number
lineno JS.Number lineno JS.Number
message JS.String message JS.String
} }
@[use_new] @[use_new]
@ -858,7 +858,7 @@ pub fn JS.ErrorEvent.prototype.constructor(typ JS.String) JS.ErrorEvent
pub interface JS.UIEvent { pub interface JS.UIEvent {
JS.Event JS.Event
detail JS.Number detail JS.Number
view JS.Any view JS.Any
} }
@[use_new] @[use_new]
@ -881,68 +881,68 @@ pub struct JS.UIEventInitDict {
pub interface JS.MouseEvent { pub interface JS.MouseEvent {
JS.UIEvent JS.UIEvent
altKey JS.Boolean altKey JS.Boolean
button JS.Number button JS.Number
buttons JS.Number buttons JS.Number
clientX JS.Number clientX JS.Number
clientY JS.Number clientY JS.Number
ctrlKey JS.Number ctrlKey JS.Number
metaKey JS.Number metaKey JS.Number
movementX JS.Number movementX JS.Number
movementY JS.Number movementY JS.Number
offsetX JS.Number offsetX JS.Number
offsetY JS.Number offsetY JS.Number
pageX JS.Number pageX JS.Number
pageY JS.Number pageY JS.Number
relatedTarget JS.Any relatedTarget JS.Any
screenX JS.Number screenX JS.Number
screenY JS.Number screenY JS.Number
shiftKey JS.Boolean shiftKey JS.Boolean
x JS.Number x JS.Number
y JS.Number y JS.Number
getModifierState(keyArg JS.String) JS.Boolean getModifierState(keyArg JS.String) JS.Boolean
} }
pub interface JS.WheelEvent { pub interface JS.WheelEvent {
JS.MouseEvent JS.MouseEvent
deltaX JS.Number deltaX JS.Number
deltaY JS.Number deltaY JS.Number
deltaZ JS.Number deltaZ JS.Number
deltaMode JS.Number deltaMode JS.Number
} }
pub interface JS.PointerEvent { pub interface JS.PointerEvent {
JS.MouseEvent JS.MouseEvent
height JS.Number height JS.Number
isPrimary JS.Boolean isPrimary JS.Boolean
pointerId JS.Number pointerId JS.Number
pointerType JS.String pointerType JS.String
pressure JS.Number pressure JS.Number
tangentialPressure JS.Number tangentialPressure JS.Number
tiltX JS.Number tiltX JS.Number
tiltY JS.Number tiltY JS.Number
twist JS.Number twist JS.Number
width JS.Number width JS.Number
getCoalescedEvents() JS.Array getCoalescedEvents() JS.Array
getPredictedEvents() JS.Array getPredictedEvents() JS.Array
} }
pub interface JS.Gamepad { pub interface JS.Gamepad {
axes JS.Array // Array<number> axes JS.Array // Array<number>
buttons JS.Array // Array<GamepadButton> buttons JS.Array // Array<GamepadButton>
connected JS.Boolean connected JS.Boolean
hapticActuators JS.Array // Array<GamepadHapticActuator> hapticActuators JS.Array // Array<GamepadHapticActuator>
id JS.String id JS.String
index JS.Number index JS.Number
mapping JS.String mapping JS.String
timestamp JS.Number timestamp JS.Number
} }
@[single_impl] @[single_impl]
pub interface JS.GamepadButton { pub interface JS.GamepadButton {
pressed JS.Boolean pressed JS.Boolean
touched JS.Boolean touched JS.Boolean
value JS.Number value JS.Number
} }
@[single_impl] @[single_impl]
@ -962,11 +962,11 @@ pub interface JS.HashChangeEvent {
pub interface JS.MessageEvent { pub interface JS.MessageEvent {
JS.Event JS.Event
data JS.Any data JS.Any
lastEventId JS.String lastEventId JS.String
origin JS.String origin JS.String
ports JS.Array ports JS.Array
source JS.Any source JS.Any
} }
pub interface JS.MessagePort { pub interface JS.MessagePort {
@ -988,20 +988,20 @@ pub interface JS.PopStateEvent {
pub interface JS.ProgressEvent { pub interface JS.ProgressEvent {
lenghtComputable JS.Boolean lenghtComputable JS.Boolean
loaded JS.Number loaded JS.Number
target JS.Any target JS.Any
total JS.Number total JS.Number
} }
pub interface JS.KeyboardEvent { pub interface JS.KeyboardEvent {
JS.UIEvent JS.UIEvent
altKey JS.Boolean altKey JS.Boolean
code JS.String code JS.String
ctrlKey JS.Boolean ctrlKey JS.Boolean
isComposing JS.Boolean isComposing JS.Boolean
key JS.String key JS.String
location JS.Number location JS.Number
metaKey JS.Boolean metaKey JS.Boolean
repeat JS.Boolean repeat JS.Boolean
shiftKey JS.Boolean shiftKey JS.Boolean
} }

View file

@ -5,7 +5,7 @@ import js.promise
pub fn JS.fetch(input JS.String, init JS.Object) JS.Promise pub fn JS.fetch(input JS.String, init JS.Object) JS.Promise
pub interface JS.Body { pub interface JS.Body {
body JS.Uint8Array body JS.Uint8Array
bodyUse JS.Boolean bodyUse JS.Boolean
blob() JS.Promise blob() JS.Promise
json() JS.Promise json() JS.Promise
@ -14,11 +14,11 @@ pub interface JS.Body {
pub interface JS.Response { pub interface JS.Response {
JS.Body JS.Body
ok JS.Boolean ok JS.Boolean
redirected JS.Boolean redirected JS.Boolean
status JS.Number status JS.Number
statusText JS.String statusText JS.String
url JS.String url JS.String
clone() JS.Response clone() JS.Response
} }

View file

@ -13,7 +13,7 @@ mut:
} }
pub interface FdEvent { pub interface FdEvent {
fd int fd int
kind FdEventType kind FdEventType
} }

View file

@ -1351,9 +1351,22 @@ pub fn (mut f Fmt) interface_decl(node ast.InterfaceDecl) {
} }
} }
mut field_aligns := []AlignInfo{}
mut comment_aligns := []AlignInfo{}
mut default_expr_aligns := []AlignInfo{}
mut field_types := []string{cap: node.fields.len}
// Calculate the alignments first
f.calculate_alignment(node.fields, mut field_aligns, mut comment_aligns, mut default_expr_aligns, mut
field_types)
mut field_align_i := 0
// TODO: alignment, comments, etc. // TODO: alignment, comments, etc.
for field in immut_fields { for field in immut_fields {
f.interface_field(field) if field_aligns[field_align_i].line_nr < field.pos.line_nr {
field_align_i++
}
f.interface_field(field, field_aligns[field_align_i])
} }
for method in immut_methods { for method in immut_methods {
f.interface_method(method) f.interface_method(method)
@ -1361,7 +1374,10 @@ pub fn (mut f Fmt) interface_decl(node ast.InterfaceDecl) {
if mut_fields.len + mut_methods.len > 0 { if mut_fields.len + mut_methods.len > 0 {
f.writeln('mut:') f.writeln('mut:')
for field in mut_fields { for field in mut_fields {
f.interface_field(field) if field_aligns[field_align_i].line_nr < field.pos.line_nr {
field_align_i++
}
f.interface_field(field, field_aligns[field_align_i])
} }
for method in mut_methods { for method in mut_methods {
f.interface_method(method) f.interface_method(method)
@ -1370,24 +1386,59 @@ pub fn (mut f Fmt) interface_decl(node ast.InterfaceDecl) {
f.writeln('}\n') f.writeln('}\n')
} }
pub fn (mut f Fmt) interface_field(field ast.StructField) { pub fn (mut f Fmt) calculate_alignment(fields []ast.StructField, mut field_aligns []AlignInfo, mut comment_aligns []AlignInfo, mut default_expr_aligns []AlignInfo, mut field_types []string) {
// Calculate the alignments first
for i, field in fields {
ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias))
// Handle anon structs recursively
field_types << ft
attrs_len := inline_attrs_len(field.attrs)
end_pos := field.pos.pos + field.pos.len
for comment in field.comments {
if comment.pos.pos >= end_pos {
if comment.pos.line_nr == field.pos.line_nr {
comment_aligns.add_info(attrs_len, field_types[i].len, comment.pos.line_nr,
use_threshold: true
)
}
continue
}
}
field_aligns.add_info(field.name.len, ft.len, field.pos.line_nr)
if field.has_default_expr {
default_expr_aligns.add_info(attrs_len, field_types[i].len, field.pos.line_nr,
use_threshold: true
)
}
}
}
pub fn (mut f Fmt) interface_field(field ast.StructField, field_align AlignInfo) {
ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias)) ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias))
before_comments := field.comments.filter(it.pos.pos < field.pos.pos) before_comments := field.comments.filter(it.pos.pos < field.pos.pos)
end_comments := field.comments.filter(it.pos.pos > field.pos.pos) end_comments := field.comments.filter(it.pos.pos > field.pos.pos)
before_len := f.line_len
if before_comments.len > 0 { if before_comments.len > 0 {
f.comments(before_comments, level: .indent) f.comments(before_comments, level: .indent)
} }
comments_len := f.line_len - before_len
sym := f.table.sym(field.typ) sym := f.table.sym(field.typ)
if sym.info is ast.Struct { if sym.info is ast.Struct {
if sym.info.is_anon { if sym.info.is_anon {
f.write('\t${field.name} ') f.write('\t${field.name} ')
f.write_anon_struct_field_decl(field.typ, ast.StructDecl{ fields: sym.info.fields }) f.write_anon_struct_field_decl(field.typ, ast.StructDecl{ fields: sym.info.fields })
} else { } else {
f.write('\t${field.name} ${ft}') f.write('\t${field.name} ')
} }
} else { } else {
f.write('\t${field.name} ${ft}') f.write('\t${field.name} ')
} }
if !(sym.info is ast.Struct && sym.info.is_anon) {
f.write(strings.repeat(` `, field_align.max_len - field.name.len - comments_len))
f.write(ft)
}
if end_comments.len > 0 { if end_comments.len > 0 {
f.comments(end_comments, level: .indent) f.comments(end_comments, level: .indent)
} else { } else {

View file

@ -32,29 +32,8 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl, is_anon bool) {
mut default_expr_aligns := []AlignInfo{} mut default_expr_aligns := []AlignInfo{}
mut field_types := []string{cap: node.fields.len} mut field_types := []string{cap: node.fields.len}
// Calculate the alignments first // Calculate the alignments first
for i, field in node.fields { f.calculate_alignment(node.fields, mut field_aligns, mut comment_aligns, mut default_expr_aligns, mut
ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias)) field_types)
// Handle anon structs recursively
field_types << ft
attrs_len := inline_attrs_len(field.attrs)
end_pos := field.pos.pos + field.pos.len
for comment in field.comments {
if comment.pos.pos >= end_pos {
if comment.pos.line_nr == field.pos.line_nr {
comment_aligns.add_info(attrs_len, field_types[i].len, comment.pos.line_nr,
use_threshold: true
)
}
continue
}
}
field_aligns.add_info(field.name.len, ft.len, field.pos.line_nr)
if field.has_default_expr {
default_expr_aligns.add_info(attrs_len, field_types[i].len, field.pos.line_nr,
use_threshold: true
)
}
}
f.writeln(' {') f.writeln(' {')
if node.pre_comments.len > 0 { if node.pre_comments.len > 0 {
f.comments_before_field(node.pre_comments) f.comments_before_field(node.pre_comments)

View file

@ -32,11 +32,11 @@ interface Bar {
interface TestsRunner { interface TestsRunner {
mut: mut:
fn_passes u64 fn_passes u64
fn_fails u64 fn_fails u64
assert_passes u64 assert_passes u64
assert_fails u64 assert_fails u64
test_fn_info &TestFnMetaInfo // filled in by generated code, before .fn_start() is called. test_fn_info &TestFnMetaInfo // filled in by generated code, before .fn_start() is called.
start(ntests int) // called before all tests, you can initialise private data here. ntests is the number of test functions in the _test.v file. start(ntests int) // called before all tests, you can initialise private data here. ntests is the number of test functions in the _test.v file.
finish() // called after all tests are finished, you should free all the private data here. finish() // called after all tests are finished, you should free all the private data here.
// //

View file

@ -0,0 +1,18 @@
interface Hex {
a int
ab int
abc int
abcd int
abcde int
mut:
aaaaaaaaaaaaaaaaaa string
b f64
}
struct Hex2 {
a int
ab int
abc int
abcd int
abcde int
}

View file

@ -0,0 +1,18 @@
interface Hex {
a int
ab int
abc int
abcd int
abcde int
mut:
aaaaaaaaaaaaaaaaaa string
b f64
}
struct Hex2 {
a int
ab int
abc int
abcd int
abcde int
}

View file

@ -12,13 +12,13 @@ __global test_runner TestRunner
interface TestRunner { interface TestRunner {
mut: mut:
file_test_info VTestFileMetaInfo // filled in by generated code, before .start() is called. file_test_info VTestFileMetaInfo // filled in by generated code, before .start() is called.
fn_test_info VTestFnMetaInfo // filled in by generated code, before .fn_start() is called. fn_test_info VTestFnMetaInfo // filled in by generated code, before .fn_start() is called.
fn_assert_passes u64 // reset this to 0 in .fn_start(), increase it in .assert_pass() fn_assert_passes u64 // reset this to 0 in .fn_start(), increase it in .assert_pass()
fn_passes u64 // increase this in .fn_pass() fn_passes u64 // increase this in .fn_pass()
fn_fails u64 // increase this in .fn_fails() fn_fails u64 // increase this in .fn_fails()
total_assert_passes u64 // increase this in .assert_pass() total_assert_passes u64 // increase this in .assert_pass()
total_assert_fails u64 // increase this in .assert_fail() total_assert_fails u64 // increase this in .assert_fail()
start(ntests int) // called before all tests, you can initialise private data here. ntests is the number of test functions in the _test.v file. start(ntests int) // called before all tests, you can initialise private data here. ntests is the number of test functions in the _test.v file.
finish() // called after all tests are finished, you can print some stats if you want here. finish() // called after all tests are finished, you can print some stats if you want here.
exit_code() int // called right after finish(), it should return the exit code, that the test program will exit with. exit_code() int // called right after finish(), it should return the exit code, that the test program will exit with.

View file

@ -1,10 +1,10 @@
interface Source { interface Source {
element_size int element_size int
data voidptr data voidptr
offset int offset int
len int len int
cap int cap int
flags ArrayFlags flags ArrayFlags
} }
fn test_array_as_interface() { fn test_array_as_interface() {

View file

@ -11,7 +11,7 @@ import v.tests.bench.math_big_gcd.prime {
} }
interface TestDataI { interface TestDataI {
r big.Integer r big.Integer
aa big.Integer aa big.Integer
bb big.Integer bb big.Integer
} }

View file

@ -6,8 +6,8 @@ pub mut:
interface Adoptable { interface Adoptable {
class_name string class_name string
age int age int
test int test int
} }
struct Cat { struct Cat {

View file

@ -1,6 +1,6 @@
interface IPerson { interface IPerson {
name string name string
age int age int
} }
struct PersonImpl { struct PersonImpl {