Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
123f6984
Unverified
Commit
123f6984
authored
Apr 28, 2016
by
Clayton Coleman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Always inline default functions on all packages
parent
66005063
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
86 additions
and
9 deletions
+86
-9
conversion.go
cmd/libs/go2idl/conversion-gen/generators/conversion.go
+86
-9
No files found.
cmd/libs/go2idl/conversion-gen/generators/conversion.go
View file @
123f6984
...
@@ -43,11 +43,21 @@ func conversionNamer() *namer.NameStrategy {
...
@@ -43,11 +43,21 @@ func conversionNamer() *namer.NameStrategy {
}
}
}
}
func
defaultFnNamer
()
*
namer
.
NameStrategy
{
return
&
namer
.
NameStrategy
{
Prefix
:
"SetDefaults_"
,
Join
:
func
(
pre
string
,
in
[]
string
,
post
string
)
string
{
return
pre
+
strings
.
Join
(
in
,
"_"
)
+
post
},
}
}
// NameSystems returns the name system used by the generators in this package.
// NameSystems returns the name system used by the generators in this package.
func
NameSystems
()
namer
.
NameSystems
{
func
NameSystems
()
namer
.
NameSystems
{
return
namer
.
NameSystems
{
return
namer
.
NameSystems
{
"public"
:
conversionNamer
(),
"public"
:
conversionNamer
(),
"raw"
:
namer
.
NewRawNamer
(
""
,
nil
),
"raw"
:
namer
.
NewRawNamer
(
""
,
nil
),
"defaultfn"
:
defaultFnNamer
(),
}
}
}
}
...
@@ -126,7 +136,64 @@ func existingConversionFunctions(context *generator.Context) conversions {
...
@@ -126,7 +136,64 @@ func existingConversionFunctions(context *generator.Context) conversions {
args
:=
argsFromType
(
inType
.
Elem
,
outType
.
Elem
)
args
:=
argsFromType
(
inType
.
Elem
,
outType
.
Elem
)
sw
.
Do
(
"Convert_$.inType|public$_To_$.outType|public$"
,
args
)
sw
.
Do
(
"Convert_$.inType|public$_To_$.outType|public$"
,
args
)
if
f
.
Name
.
Name
==
buffer
.
String
()
{
if
f
.
Name
.
Name
==
buffer
.
String
()
{
preexisting
[
conversionType
{
inType
.
Elem
,
outType
.
Elem
}]
=
f
key
:=
conversionType
{
inType
.
Elem
,
outType
.
Elem
}
if
v
,
ok
:=
preexisting
[
key
];
ok
&&
v
!=
nil
{
panic
(
fmt
.
Sprintf
(
"duplicate static conversion defined: %#v"
,
key
))
}
preexisting
[
key
]
=
f
}
buffer
.
Reset
()
}
}
return
preexisting
}
// All of the types in conversions map are of type "DeclarationOf" with
// the underlying type being "Func".
type
defaulters
map
[
*
types
.
Type
]
*
types
.
Type
// Returns all already existing defaulting functions that we are able to find.
func
existingDefaultingFunctions
(
context
*
generator
.
Context
)
defaulters
{
buffer
:=
&
bytes
.
Buffer
{}
sw
:=
generator
.
NewSnippetWriter
(
buffer
,
context
,
"$"
,
"$"
)
preexisting
:=
make
(
defaulters
)
for
_
,
p
:=
range
context
.
Universe
{
for
_
,
f
:=
range
p
.
Functions
{
if
f
.
Underlying
==
nil
||
f
.
Underlying
.
Kind
!=
types
.
Func
{
glog
.
Errorf
(
"Malformed function: %#v"
,
f
)
continue
}
if
f
.
Underlying
.
Signature
==
nil
{
glog
.
Errorf
(
"Function without signature: %#v"
,
f
)
continue
}
signature
:=
f
.
Underlying
.
Signature
// Check whether the function is conversion function.
// Note that all of them have signature:
// func Convert_inType_To_outType(inType, outType, conversion.Scope) error
if
signature
.
Receiver
!=
nil
{
continue
}
if
len
(
signature
.
Parameters
)
!=
1
{
continue
}
if
len
(
signature
.
Results
)
!=
0
{
continue
}
inType
:=
signature
.
Parameters
[
0
]
if
inType
.
Kind
!=
types
.
Pointer
{
continue
}
// Now check if the name satisfies the convention.
args
:=
defaultingArgsFromType
(
inType
.
Elem
)
sw
.
Do
(
"$.inType|defaultfn$"
,
args
)
if
f
.
Name
.
Name
==
buffer
.
String
()
{
key
:=
inType
.
Elem
if
v
,
ok
:=
preexisting
[
key
];
ok
&&
v
!=
nil
{
panic
(
fmt
.
Sprintf
(
"duplicate static defaulter defined: %#v"
,
key
))
}
preexisting
[
key
]
=
f
}
}
buffer
.
Reset
()
buffer
.
Reset
()
}
}
...
@@ -154,6 +221,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
...
@@ -154,6 +221,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
// Compute all pre-existing conversion functions.
// Compute all pre-existing conversion functions.
preexisting
:=
existingConversionFunctions
(
context
)
preexisting
:=
existingConversionFunctions
(
context
)
preexistingDefaults
:=
existingDefaultingFunctions
(
context
)
// We are generating conversions only for packages that are explicitly
// We are generating conversions only for packages that are explicitly
// passed as InputDir, and only for those that have a corresponding type
// passed as InputDir, and only for those that have a corresponding type
...
@@ -205,7 +273,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
...
@@ -205,7 +273,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
GeneratorFunc
:
func
(
c
*
generator
.
Context
)
(
generators
[]
generator
.
Generator
)
{
GeneratorFunc
:
func
(
c
*
generator
.
Context
)
(
generators
[]
generator
.
Generator
)
{
generators
=
[]
generator
.
Generator
{}
generators
=
[]
generator
.
Generator
{}
generators
=
append
(
generators
=
append
(
generators
,
NewGenConversion
(
"conversion_generated"
,
path
,
preexisting
))
generators
,
NewGenConversion
(
"conversion_generated"
,
path
,
preexisting
,
preexistingDefaults
))
return
generators
return
generators
},
},
FilterFunc
:
func
(
c
*
generator
.
Context
,
t
*
types
.
Type
)
bool
{
FilterFunc
:
func
(
c
*
generator
.
Context
,
t
*
types
.
Type
)
bool
{
...
@@ -308,17 +376,19 @@ type genConversion struct {
...
@@ -308,17 +376,19 @@ type genConversion struct {
generator
.
DefaultGen
generator
.
DefaultGen
targetPackage
string
targetPackage
string
preexisting
conversions
preexisting
conversions
defaulters
defaulters
imports
namer
.
ImportTracker
imports
namer
.
ImportTracker
typesForInit
[]
conversionType
typesForInit
[]
conversionType
}
}
func
NewGenConversion
(
sanitizedName
,
targetPackage
string
,
preexisting
conversions
)
generator
.
Generator
{
func
NewGenConversion
(
sanitizedName
,
targetPackage
string
,
preexisting
conversions
,
defaulters
defaulters
)
generator
.
Generator
{
return
&
genConversion
{
return
&
genConversion
{
DefaultGen
:
generator
.
DefaultGen
{
DefaultGen
:
generator
.
DefaultGen
{
OptionalName
:
sanitizedName
,
OptionalName
:
sanitizedName
,
},
},
targetPackage
:
targetPackage
,
targetPackage
:
targetPackage
,
preexisting
:
preexisting
,
preexisting
:
preexisting
,
defaulters
:
defaulters
,
imports
:
generator
.
NewImportTracker
(),
imports
:
generator
.
NewImportTracker
(),
typesForInit
:
make
([]
conversionType
,
0
),
typesForInit
:
make
([]
conversionType
,
0
),
}
}
...
@@ -388,7 +458,7 @@ func (g *genConversion) isOtherPackage(pkg string) bool {
...
@@ -388,7 +458,7 @@ func (g *genConversion) isOtherPackage(pkg string) bool {
}
}
func
(
g
*
genConversion
)
Imports
(
c
*
generator
.
Context
)
(
imports
[]
string
)
{
func
(
g
*
genConversion
)
Imports
(
c
*
generator
.
Context
)
(
imports
[]
string
)
{
importLines
:=
[]
string
{
"reflect
\"
reflect
\"
"
}
var
importLines
[]
string
if
g
.
isOtherPackage
(
apiPackagePath
)
{
if
g
.
isOtherPackage
(
apiPackagePath
)
{
importLines
=
append
(
importLines
,
"api
\"
"
+
apiPackagePath
+
"
\"
"
)
importLines
=
append
(
importLines
,
"api
\"
"
+
apiPackagePath
+
"
\"
"
)
}
}
...
@@ -410,6 +480,11 @@ func argsFromType(inType, outType *types.Type) interface{} {
...
@@ -410,6 +480,11 @@ func argsFromType(inType, outType *types.Type) interface{} {
}
}
}
}
func
defaultingArgsFromType
(
inType
*
types
.
Type
)
interface
{}
{
return
map
[
string
]
interface
{}{
"inType"
:
inType
,
}
}
func
(
g
*
genConversion
)
funcNameTmpl
(
inType
,
outType
*
types
.
Type
)
string
{
func
(
g
*
genConversion
)
funcNameTmpl
(
inType
,
outType
*
types
.
Type
)
string
{
tmpl
:=
"Convert_$.inType|public$_To_$.outType|public$"
tmpl
:=
"Convert_$.inType|public$_To_$.outType|public$"
g
.
imports
.
AddType
(
inType
)
g
.
imports
.
AddType
(
inType
)
...
@@ -461,9 +536,11 @@ func (g *genConversion) generateConversion(inType, outType *types.Type, sw *gene
...
@@ -461,9 +536,11 @@ func (g *genConversion) generateConversion(inType, outType *types.Type, sw *gene
}
else
{
}
else
{
sw
.
Do
(
fmt
.
Sprintf
(
"func auto%s(in *$.inType|raw$, out *$.outType|raw$, s conversion.Scope) error {
\n
"
,
funcName
),
argsFromType
(
inType
,
outType
))
sw
.
Do
(
fmt
.
Sprintf
(
"func auto%s(in *$.inType|raw$, out *$.outType|raw$, s conversion.Scope) error {
\n
"
,
funcName
),
argsFromType
(
inType
,
outType
))
}
}
sw
.
Do
(
"if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
\n
"
,
nil
)
// if no defaulter of form SetDefaults_XXX is defined, do not inline a check for defaulting.
sw
.
Do
(
"defaulting.(func(*$.|raw$))(in)
\n
"
,
inType
)
if
function
,
ok
:=
g
.
defaulters
[
inType
];
ok
{
sw
.
Do
(
"}
\n
"
,
nil
)
sw
.
Do
(
"$.|raw$(in)
\n
"
,
function
)
}
g
.
generateFor
(
inType
,
outType
,
sw
)
g
.
generateFor
(
inType
,
outType
,
sw
)
sw
.
Do
(
"return nil
\n
"
,
nil
)
sw
.
Do
(
"return nil
\n
"
,
nil
)
sw
.
Do
(
"}
\n\n
"
,
nil
)
sw
.
Do
(
"}
\n\n
"
,
nil
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment