-
Notifications
You must be signed in to change notification settings - Fork 446
Feature: Add method handling to mixin processing in KDL #2100
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 12 commits
a62a343
e3f0a20
d7e96fb
a88fbed
2fcb5b9
e6da694
37825cf
c095db7
9682083
6aa05dd
8f7ca28
0741374
7338aab
333fb26
ea16eb1
fcd4188
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Manually moved from Document | ||
// See https://github.com/w3c/csswg-drafts/issues/5886 and https://github.com/w3c/csswg-drafts/issues/556 | ||
interface-mixin DocumentOrShadowRoot { | ||
method elementFromPoint returns=Element nullable=#true { | ||
param x type=long | ||
param y type=long | ||
} | ||
method elementsFromPoint { | ||
type sequence { | ||
type Element | ||
} | ||
param x type=long | ||
param y type=long | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
import { parse, type Value, type Node } from "kdljs"; | ||
import type { Enum, Event, Property, Interface, WebIdl } from "./types"; | ||
import type { Enum, Event, Property, Interface, WebIdl, Method } from "./types"; | ||
import { readdir, readFile } from "fs/promises"; | ||
import { merge } from "./helpers.js"; | ||
|
||
|
@@ -94,6 +94,7 @@ function handleMixin(node: Node): DeepPartial<Interface> { | |
|
||
const event: Event[] = []; | ||
const property: Record<string, Partial<Property>> = {}; | ||
const method: Record<string, Partial<Method>> = {}; | ||
|
||
for (const child of node.children) { | ||
switch (child.name) { | ||
|
@@ -105,6 +106,11 @@ function handleMixin(node: Node): DeepPartial<Interface> { | |
property[propName] = handleProperty(child); | ||
break; | ||
} | ||
case "method": { | ||
const methodName = child.values[0] as string; | ||
method[methodName] = handleMethod(child); | ||
break; | ||
} | ||
default: | ||
throw new Error(`Unknown node name: ${child.name}`); | ||
} | ||
|
@@ -114,6 +120,7 @@ function handleMixin(node: Node): DeepPartial<Interface> { | |
name, | ||
events: { event }, | ||
properties: { property }, | ||
methods: { method }, | ||
...optionalMember("extends", "string", node.properties?.extends), | ||
} as DeepPartial<Interface>; | ||
} | ||
|
@@ -142,6 +149,37 @@ function handleProperty(child: Node): Partial<Property> { | |
}; | ||
} | ||
|
||
/** | ||
* Handles a child node of type "method" and adds it to the method object. | ||
* @param child The child node to handle. | ||
*/ | ||
function handleMethod(child: Node): Partial<Method> { | ||
const name = child.values[0] as string; | ||
const type = child.children[0]; | ||
const returnType = child.properties.returns as string; | ||
const nullable = child.properties.nullable as boolean; | ||
|
||
const params = child.children | ||
.filter((c) => c.values[0] != "sequence") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should filter in based on the type There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
.map((c) => ({ | ||
name: c.values[0] as string, | ||
type: c.properties.type as string, | ||
})); | ||
|
||
const signature: Method["signature"] = [ | ||
{ | ||
type: type.name == "type" ? (type.values[0] as string) : returnType, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We'll probably get similar situation on other things than methods, this should probably be done in a helper function so that others can reuse it, something like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have made it a helper function |
||
param: params, | ||
nullable, | ||
subtype: | ||
type.name == "type" | ||
? { type: type.children[0].values[0] as string } | ||
: undefined, | ||
}, | ||
]; | ||
return { name, signature }; | ||
} | ||
|
||
/** | ||
* Collect all file URLs in a directory. | ||
*/ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nullable
is logically a property of the return type rather than the method, so in this case it would be also nicer to use separate type node as below.