...

Text file src/go/printer/testdata/declarations.input

Documentation: go/printer/testdata

     1// Copyright 2009 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5package imports
     6
     7import "io"
     8
     9import (
    10	_ "io"
    11)
    12
    13import _ "io"
    14
    15import (
    16	"io"
    17	"io"
    18	"io"
    19)
    20
    21import (
    22	"io"
    23	aLongRename "io"
    24
    25	b "io"
    26)
    27
    28import (
    29       "unrenamed"
    30       renamed "renameMe"
    31       . "io"
    32       _ "io"
    33       "io"
    34       . "os"
    35)
    36
    37// no newlines between consecutive single imports, but
    38// respect extra line breaks in the source (at most one empty line)
    39import _ "io"
    40import _ "io"
    41import _ "io"
    42
    43import _ "os"
    44import _ "os"
    45import _ "os"
    46
    47
    48import _ "fmt"
    49import _ "fmt"
    50import _ "fmt"
    51
    52import "foo"  // a comment
    53import "bar"  // a comment
    54
    55import (
    56	_ "foo"
    57	// a comment
    58	"bar"
    59	"foo"  // a comment
    60	"bar"  // a comment
    61)
    62
    63// comments + renames
    64import (
    65       "unrenamed" // a comment
    66       renamed "renameMe"
    67       . "io" /* a comment */
    68       _ "io/ioutil" // a comment
    69       "io" // testing alignment
    70       . "os"
    71       // a comment
    72)
    73
    74// a case that caused problems in the past (comment placement)
    75import (
    76	. "fmt"
    77	"io"
    78	"malloc"	// for the malloc count test only
    79	"math"
    80	"strings"
    81	"testing"
    82)
    83
    84// more import examples
    85import (
    86	"xxx"
    87	"much_longer_name" // comment
    88	"short_name" // comment
    89)
    90
    91import (
    92	_ "xxx"
    93	"much_longer_name" // comment
    94)
    95
    96import (
    97	mymath "math"
    98	"/foo/bar/long_package_path" // a comment
    99)
   100
   101import (
   102	"package_a" // comment
   103	"package_b"
   104	my_better_c "package_c" // comment
   105	"package_d" // comment
   106	my_e "package_e" // comment
   107
   108	"package_a"    // comment
   109	"package_bb"
   110	"package_ccc"  // comment
   111	"package_dddd" // comment
   112)
   113
   114// print import paths as double-quoted strings
   115// (we would like more test cases but the go/parser
   116// already excludes most incorrect paths, and we don't
   117// bother setting up test-ASTs manually)
   118import (
   119	`fmt`
   120	"math"
   121)
   122
   123// at least one empty line between declarations of different kind
   124import _ "io"
   125var _ int
   126
   127// at least one empty line between declarations of the same kind
   128// if there is associated documentation (was issue 2570)
   129type T1 struct{}
   130// T2 comment
   131type T2 struct {
   132} // should be a two-line struct
   133
   134
   135// T3 comment
   136type T2 struct {
   137
   138
   139} // should be a two-line struct
   140
   141
   142// printing of constant literals
   143const (
   144	_ = "foobar"
   145	_ = "a۰۱۸"
   146	_ = "foo६४"
   147	_ = "bar9876"
   148	_ = 0
   149	_ = 1
   150	_ = 123456789012345678890
   151	_ = 01234567
   152	_ = 0xcafebabe
   153	_ = 0.
   154	_ = .0
   155	_ = 3.14159265
   156	_ = 1e0
   157	_ = 1e+100
   158	_ = 1e-100
   159	_ = 2.71828e-1000
   160	_ = 0i
   161	_ = 1i
   162	_ = 012345678901234567889i
   163	_ = 123456789012345678890i
   164	_ = 0.i
   165	_ = .0i
   166	_ = 3.14159265i
   167	_ = 1e0i
   168	_ = 1e+100i
   169	_ = 1e-100i
   170	_ = 2.71828e-1000i
   171	_ = 'a'
   172	_ = '\000'
   173	_ = '\xFF'
   174	_ = '\uff16'
   175	_ = '\U0000ff16'
   176	_ = `foobar`
   177	_ = `foo
   178---
   179---
   180bar`
   181)
   182
   183
   184func _() {
   185	type _ int
   186	type _ *int
   187	type _ []int
   188	type _ map[string]int
   189	type _ chan int
   190	type _ func() int
   191
   192	var _ int
   193	var _ *int
   194	var _ []int
   195	var _ map[string]int
   196	var _ chan int
   197	var _ func() int
   198
   199	type _ struct{}
   200	type _ *struct{}
   201	type _ []struct{}
   202	type _ map[string]struct{}
   203	type _ chan struct{}
   204	type _ func() struct{}
   205
   206	type _ interface{}
   207	type _ *interface{}
   208	type _ []interface{}
   209	type _ map[string]interface{}
   210	type _ chan interface{}
   211	type _ func() interface{}
   212
   213	var _ struct{}
   214	var _ *struct{}
   215	var _ []struct{}
   216	var _ map[string]struct{}
   217	var _ chan struct{}
   218	var _ func() struct{}
   219
   220	var _ interface{}
   221	var _ *interface{}
   222	var _ []interface{}
   223	var _ map[string]interface{}
   224	var _ chan interface{}
   225	var _ func() interface{}
   226}
   227
   228
   229// don't lose blank lines in grouped declarations
   230const (
   231	_ int = 0
   232	_ float = 1
   233
   234	_ string = "foo"
   235
   236	_ = iota
   237	_
   238	
   239	// a comment
   240	_
   241
   242	_
   243)
   244
   245
   246type (
   247	_ int
   248	_ struct {}
   249	
   250	_ interface{}
   251	
   252	// a comment
   253	_ map[string]int
   254)
   255
   256
   257var (
   258	_ int = 0
   259	_ float = 1
   260
   261	_ string = "foo"
   262
   263	_ bool
   264	
   265	// a comment
   266	_ bool
   267)
   268
   269
   270// don't lose blank lines in this struct
   271type _ struct {
   272	String struct {
   273		Str, Len int
   274	}
   275	Slice struct {
   276		Array, Len, Cap int
   277	}
   278	Eface struct {
   279		Typ, Ptr int
   280	}
   281
   282	UncommonType struct {
   283		Name, PkgPath int
   284	}
   285	CommonType struct {
   286		Size, Hash, Alg, Align, FieldAlign, String, UncommonType int
   287	}
   288	Type struct {
   289		Typ, Ptr int
   290	}
   291	StructField struct {
   292		Name, PkgPath, Typ, Tag, Offset int
   293	}
   294	StructType struct {
   295		Fields int
   296	}
   297	PtrType struct {
   298		Elem int
   299	}
   300	SliceType struct {
   301		Elem int
   302	}
   303	ArrayType struct {
   304		Elem, Len int
   305	}
   306
   307	Stktop struct {
   308		Stackguard, Stackbase, Gobuf int
   309	}
   310	Gobuf struct {
   311		Sp, Pc, G int
   312	}
   313	G struct {
   314		Stackbase, Sched, Status, Alllink int
   315	}
   316}
   317
   318
   319// no blank lines in empty structs and interfaces, but leave 1- or 2-line layout alone
   320type _ struct{            }
   321type _ struct {
   322
   323}
   324
   325type _ interface{            }
   326type _ interface {
   327
   328}
   329
   330
   331// no tabs for single or ungrouped decls
   332func _() {
   333	const xxxxxx = 0
   334	type x int
   335	var xxx int
   336	var yyyy float = 3.14
   337	var zzzzz = "bar"
   338
   339	const (
   340		xxxxxx = 0
   341	)
   342	type (
   343		x int
   344	)
   345	var (
   346		xxx int
   347	)
   348	var (
   349		yyyy float = 3.14
   350	)
   351	var (
   352		zzzzz = "bar"
   353	)
   354}
   355
   356// tabs for multiple or grouped decls
   357func _() {
   358	// no entry has a type
   359	const (
   360		zzzzzz = 1
   361		z = 2
   362		zzz = 3
   363	)
   364	// some entries have a type
   365	const (
   366		xxxxxx = 1
   367		x = 2
   368		xxx = 3
   369		yyyyyyyy float = iota
   370		yyyy = "bar"
   371		yyy
   372		yy = 2
   373	)
   374}
   375
   376func _() {
   377	// no entry has a type
   378	var (
   379		zzzzzz = 1
   380		z = 2
   381		zzz = 3
   382	)
   383	// no entry has a value
   384	var (
   385		_ int
   386		_ float
   387		_ string
   388
   389		_ int  // comment
   390		_ float  // comment
   391		_ string  // comment
   392	)
   393	// some entries have a type
   394	var (
   395		xxxxxx int
   396		x float
   397		xxx string
   398		yyyyyyyy int = 1234
   399		y float = 3.14
   400		yyyy = "bar"
   401		yyy string = "foo"
   402	)
   403	// mixed entries - all comments should be aligned
   404	var (
   405		a, b, c int
   406		x = 10
   407		d int  // comment
   408		y = 20  // comment
   409		f, ff, fff, ffff int = 0, 1, 2, 3  // comment
   410	)
   411	// respect original line breaks
   412	var _ = []T {
   413		T{0x20,	"Telugu"},
   414	}
   415	var _ = []T {
   416		// respect original line breaks
   417		T{0x20,	"Telugu"},
   418	}
   419}
   420
   421// use the formatted output rather than the input to decide when to align
   422// (was issue 4505)
   423const (
   424	short = 2 * (
   425	1 + 2)
   426	aMuchLongerName = 3
   427)
   428
   429var (
   430	short = X{
   431	}
   432	aMuchLongerName = X{}
   433
   434	x1 = X{} // foo
   435	x2 = X{
   436	} // foo
   437)
   438
   439func _() {
   440	type (
   441		xxxxxx int
   442		x float
   443		xxx string
   444		xxxxx []x
   445		xx struct{}
   446		xxxxxxx struct {
   447			_, _ int
   448			_ float
   449		}
   450		xxxx chan<- string
   451	)
   452}
   453
   454// alignment of "=" in consecutive lines (extended example from issue 1414)
   455const (
   456	umax uint                  = ^uint(0) // maximum value for a uint
   457	bpu  = 1 << (5 + umax>>63)            // bits per uint
   458	foo
   459	bar  = -1
   460)
   461
   462// typical enum
   463const (
   464	a MyType = iota
   465	abcd
   466	b
   467	c
   468	def
   469)
   470
   471// excerpt from godoc.go
   472var (
   473	goroot = flag.String("goroot", runtime.GOROOT(), "Go root directory")
   474	testDir = flag.String("testdir", "", "Go root subdirectory - for testing only (faster startups)")
   475	pkgPath = flag.String("path", "", "additional package directories (colon-separated)")
   476	filter = flag.String("filter", "", "filter file containing permitted package directory paths")
   477	filterMin = flag.Int("filter_minutes", 0, "filter file update interval in minutes; disabled if <= 0")
   478	filterDelay delayTime // actual filter update interval in minutes; usually filterDelay == filterMin, but filterDelay may back off exponentially
   479)
   480
   481
   482// formatting of structs
   483type _ struct{}
   484
   485type _ struct{ /* this comment should be visible */ }
   486
   487type _ struct{
   488	// this comment should be visible and properly indented
   489}
   490
   491type _ struct {  // this comment must not change indentation
   492	f int
   493	f, ff, fff, ffff int
   494}
   495
   496type _ struct {
   497	string
   498}
   499
   500type _ struct {
   501	string  // comment
   502}
   503
   504type _ struct {
   505	string "tag"
   506}
   507
   508type _ struct {
   509	string "tag"  // comment
   510}
   511
   512type _ struct {
   513	f int
   514}
   515
   516type _ struct {
   517	f int  // comment
   518}
   519
   520type _ struct {
   521	f int "tag"
   522}
   523
   524type _ struct {
   525	f int "tag"  // comment
   526}
   527
   528type _ struct {
   529	bool
   530	a, b, c int
   531	int "tag"
   532	ES // comment
   533	float "tag"  // comment
   534	f int  // comment
   535	f, ff, fff, ffff int  // comment
   536	g float "tag"
   537	h float "tag"  // comment
   538}
   539
   540type _ struct { a, b,
   541c, d int  // this line should be indented
   542u, v, w, x float // this line should be indented
   543p, q,
   544r, s float // this line should be indented
   545}
   546
   547
   548// difficult cases
   549type _ struct {
   550	bool  // comment
   551	text []byte  // comment
   552}
   553
   554
   555// formatting of interfaces
   556type EI interface{}
   557
   558type _ interface {
   559	EI
   560}
   561
   562type _ interface {
   563	f()
   564	fffff()
   565}
   566
   567type _ interface {
   568	EI
   569	f()
   570	fffffg()
   571}
   572
   573type _ interface {  // this comment must not change indentation
   574	EI  // here's a comment
   575	f()  // no blank between identifier and ()
   576	fffff()  // no blank between identifier and ()
   577	gggggggggggg(x, y, z int) ()  // hurray
   578}
   579
   580
   581// formatting of variable declarations
   582func _() {
   583	type day struct { n int; short, long string }
   584	var (
   585		Sunday = day{ 0, "SUN", "Sunday" }
   586		Monday = day{ 1, "MON", "Monday" }
   587		Tuesday = day{ 2, "TUE", "Tuesday" }
   588		Wednesday = day{ 3, "WED", "Wednesday" }
   589		Thursday = day{ 4, "THU", "Thursday" }
   590		Friday = day{ 5, "FRI", "Friday" }
   591		Saturday = day{ 6, "SAT", "Saturday" }
   592	)
   593}
   594
   595
   596// formatting of multi-line variable declarations
   597var a1, b1, c1 int  // all on one line
   598
   599var a2, b2,
   600c2 int  // this line should be indented
   601
   602var (a3, b3,
   603c3, d3 int  // this line should be indented
   604a4, b4, c4 int  // this line should be indented
   605)
   606
   607// Test case from issue 3304: multi-line declarations must end
   608// a formatting section and not influence indentation of the
   609// next line.
   610var (
   611	minRefreshTimeSec = flag.Int64("min_refresh_time_sec", 604800,
   612		"minimum time window between two refreshes for a given user.")
   613	x = flag.Int64("refresh_user_rollout_percent", 100,
   614		"temporary flag to ramp up the refresh user rpc")
   615	aVeryLongVariableName = stats.GetVarInt("refresh-user-count")
   616)
   617
   618func _() {
   619	var privateKey2 = &Block{Type: "RSA PRIVATE KEY",
   620					Headers: map[string]string{},
   621					Bytes: []uint8{0x30, 0x82, 0x1, 0x3a, 0x2, 0x1, 0x0, 0x2,
   622			0x41, 0x0, 0xb2, 0x99, 0xf, 0x49, 0xc4, 0x7d, 0xfa, 0x8c,
   623			0xd4, 0x0, 0xae, 0x6a, 0x4d, 0x1b, 0x8a, 0x3b, 0x6a, 0x13,
   624			0x64, 0x2b, 0x23, 0xf2, 0x8b, 0x0, 0x3b, 0xfb, 0x97, 0x79,
   625		},
   626	}
   627}
   628
   629
   630func _() {
   631	var Universe = Scope {
   632		Names: map[string]*Ident {
   633			// basic types
   634			"bool": nil,
   635			"byte": nil,
   636			"int8": nil,
   637			"int16": nil,
   638			"int32": nil,
   639			"int64": nil,
   640			"uint8": nil,
   641			"uint16": nil,
   642			"uint32": nil,
   643			"uint64": nil,
   644			"float32": nil,
   645			"float64": nil,
   646			"string": nil,
   647
   648			// convenience types
   649			"int": nil,
   650			"uint": nil,
   651			"uintptr": nil,
   652			"float": nil,
   653
   654			// constants
   655			"false": nil,
   656			"true": nil,
   657			"iota": nil,
   658			"nil": nil,
   659
   660			// functions
   661			"cap": nil,
   662			"len": nil,
   663			"new": nil,
   664			"make": nil,
   665			"panic": nil,
   666			"panicln": nil,
   667			"print": nil,
   668			"println": nil,
   669		},
   670	}
   671}
   672
   673
   674// alignment of map composite entries
   675var _ = map[int]int{
   676	// small key sizes: always align even if size ratios are large
   677	a: a,
   678	abcdefghabcdefgh: a,
   679	ab: a,
   680	abc: a,
   681	abcdefgabcdefg: a,
   682	abcd: a,
   683	abcde: a,
   684	abcdef: a,
   685
   686	// mixed key sizes: align when key sizes change within accepted ratio
   687	abcdefgh: a,
   688	abcdefghabcdefg: a,
   689	abcdefghij: a,
   690	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij: a, // outlier - do not align with previous line
   691	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij: a, // align with previous line
   692
   693	ab: a, // do not align with previous line
   694	abcde: a, // align with previous line
   695}
   696
   697// alignment of map composite entries: test cases from issue 3965
   698// aligned
   699var _ = T1{
   700	a:                    x,
   701	b:                    y,
   702	cccccccccccccccccccc: z,
   703}
   704
   705// not aligned
   706var _ = T2{
   707	a: x,
   708	b: y,
   709	ccccccccccccccccccccc: z,
   710}
   711
   712// aligned
   713var _ = T3{
   714	aaaaaaaaaaaaaaaaaaaa: x,
   715	b:                    y,
   716	c:                    z,
   717}
   718
   719// not aligned
   720var _ = T4{
   721	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: x,
   722	b:                                       y,
   723	c:                                       z,
   724}
   725
   726
   727// no alignment of map composite entries if they are not the first entry on a line
   728var _ = T{0: 0} // not aligned
   729var _ = T{0: 0, // not aligned
   730	1: 1, // aligned
   731	22: 22, // aligned
   732	333: 333, 1234: 12, 12345: 0, // first on line aligned
   733}
   734
   735
   736// test cases form issue 8685
   737// not aligned
   738var _ = map[int]string{1: "spring", 2: "summer",
   739					3:             "autumn", 4: "winter"}
   740
   741// not aligned
   742var _ = map[string]string{"a": "spring", "b": "summer",
   743	"c": "autumn", "d": "winter"}
   744
   745// aligned
   746var _ = map[string]string{"a": "spring",
   747"b": "summer",
   748	"c": "autumn",
   749"d": "winter"}
   750
   751
   752func _() {
   753	var _ = T{
   754		a,	// must introduce trailing comma
   755	}
   756}
   757
   758
   759// formatting of function results
   760func _() func() {}
   761func _() func(int) { return nil }
   762func _() func(int) int { return nil }
   763func _() func(int) func(int) func() { return nil }
   764
   765
   766// formatting of consecutive single-line functions
   767func _() {}
   768func _() {}
   769func _() {}
   770
   771func _() {}  // an empty line before this function
   772func _() {}
   773func _() {}
   774
   775func _() { f(1, 2, 3) }
   776func _(x int) int { y := x; return y+1 }
   777func _() int { type T struct{}; var x T; return x }
   778
   779// these must remain multi-line since they are multi-line in the source
   780func _() {
   781	f(1, 2, 3)
   782}
   783func _(x int) int {
   784	y := x; return y+1
   785}
   786func _() int {
   787	type T struct{}; var x T; return x
   788}
   789
   790
   791// making function declarations safe for new semicolon rules
   792func _() { /* single-line function because of "short-ish" comment */ }
   793func _() { /* multi-line function because of "long-ish" comment - much more comment text is following here */ /* and more */ }
   794
   795func _() {
   796/* multi-line func because block is on multiple lines */ }
   797
   798// test case for issue #19544
   799func _() {}
   800func _longer_name_() { // this comment must not force the {} from above to alignment
   801	// multiple lines
   802}
   803
   804// ellipsis parameters
   805func _(...int)
   806func _(...*int)
   807func _(...[]int)
   808func _(...struct{})
   809func _(bool, ...interface{})
   810func _(bool, ...func())
   811func _(bool, ...func(...int))
   812func _(bool, ...map[string]int)
   813func _(bool, ...chan int)
   814
   815func _(b bool, x ...int)
   816func _(b bool, x ...*int)
   817func _(b bool, x ...[]int)
   818func _(b bool, x ...struct{})
   819func _(x ...interface{})
   820func _(x ...func())
   821func _(x ...func(...int))
   822func _(x ...map[string]int)
   823func _(x ...chan int)
   824
   825
   826// these parameter lists must remain multi-line since they are multi-line in the source
   827func _(bool,
   828int) {
   829}
   830func _(x bool,
   831y int) {
   832}
   833func _(x,
   834y bool) {
   835}
   836func _(bool, // comment
   837int) {
   838}
   839func _(x bool, // comment
   840y int) {
   841}
   842func _(x, // comment
   843y bool) {
   844}
   845func _(bool, // comment
   846// comment
   847int) {
   848}
   849func _(x bool, // comment
   850// comment
   851y int) {
   852}
   853func _(x, // comment
   854// comment
   855y bool) {
   856}
   857func _(bool,
   858// comment
   859int) {
   860}
   861func _(x bool,
   862// comment
   863y int) {
   864}
   865func _(x,
   866// comment
   867y bool) {
   868}
   869func _(x, // comment
   870y,// comment
   871z bool) {
   872}
   873func _(x, // comment
   874	y,// comment
   875	z bool) {
   876}
   877func _(x int,	// comment
   878	y float,	// comment
   879	z bool) {
   880}
   881
   882
   883// properly indent multi-line signatures
   884func ManageStatus(in <-chan *Status, req <-chan Request,
   885stat chan<- *TargetInfo,
   886TargetHistorySize int) {
   887}
   888
   889func MultiLineSignature0(
   890a, b, c int,
   891) {}
   892
   893func MultiLineSignature1(
   894a, b, c int,
   895u, v, w float,
   896) {}
   897
   898func MultiLineSignature2(
   899a, b,
   900c int,
   901) {}
   902
   903func MultiLineSignature3(
   904a, b,
   905c int, u, v,
   906w float,
   907		x ...int) {}
   908
   909func MultiLineSignature4(
   910a, b, c int,
   911u, v,
   912w float,
   913		x ...int) {}
   914
   915func MultiLineSignature5(
   916a, b, c int,
   917u, v, w float,
   918p, q,
   919r string,
   920		x ...int) {}
   921
   922// make sure it also works for methods in interfaces
   923type _ interface {
   924MultiLineSignature0(
   925a, b, c int,
   926)
   927
   928MultiLineSignature1(
   929a, b, c int,
   930u, v, w float,
   931)
   932
   933MultiLineSignature2(
   934a, b,
   935c int,
   936)
   937
   938MultiLineSignature3(
   939a, b,
   940c int, u, v,
   941w float,
   942		x ...int)
   943
   944MultiLineSignature4(
   945a, b, c int,
   946u, v,
   947w float,
   948		x ...int)
   949
   950MultiLineSignature5(
   951a, b, c int,
   952u, v, w float,
   953p, q,
   954r string,
   955		x ...int)
   956}
   957
   958// omit superfluous parentheses in parameter lists
   959func _((int))
   960func _((((((int))))))
   961func _(x (int))
   962func _(x (((((int))))))
   963func _(x, y (int))
   964func _(x, y (((((int))))))
   965
   966func _() (int)
   967func _() ((int))
   968func _() ((((((int))))))
   969
   970func _() (x int)
   971func _() (x (int))
   972func _() (x (((((int))))))
   973
   974// special cases: some channel types require parentheses
   975func _(x chan(<-chan int))
   976func _(x (chan(<-chan int)))
   977func _(x ((((chan(<-chan int))))))
   978
   979func _(x chan<-(chan int))
   980func _(x (chan<-(chan int)))
   981func _(x ((((chan<-(chan int))))))
   982
   983// don't introduce comma after last parameter if the closing ) is on the same line
   984// even if the parameter type itself is multi-line (test cases from issue 4533)
   985func _(...interface{})
   986func _(...interface {
   987	m()
   988	n()
   989}) // no extra comma between } and )
   990
   991func (t *T) _(...interface{})
   992func (t *T) _(...interface {
   993	m()
   994	n()
   995}) // no extra comma between } and )
   996
   997func _(interface{})
   998func _(interface {
   999	m()
  1000}) // no extra comma between } and )
  1001
  1002func _(struct{})
  1003func _(struct {
  1004	x int
  1005	y int
  1006}) // no extra comma between } and )
  1007
  1008// alias declarations
  1009
  1010type c0 struct{}
  1011type c1 = C
  1012type c2 = struct{ x int}
  1013type c3 = p.C
  1014type (
  1015	s struct{}
  1016	a = A
  1017	b = A
  1018	c = foo
  1019	d = interface{}
  1020	ddd = p.Foo
  1021)

View as plain text