From 4edf8e1c6c5eb39fc231d5dd9db5e5588f1453e0 Mon Sep 17 00:00:00 2001 From: Sharan Roongta Date: Fri, 26 Feb 2021 21:26:24 +0100 Subject: [PATCH 1/3] better yaml error description for type mismatch --- src/YAML_types.f90 | 72 +++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/src/YAML_types.f90 b/src/YAML_types.f90 index b71261d9c..92e2a41ba 100644 --- a/src/YAML_types.f90 +++ b/src/YAML_types.f90 @@ -302,16 +302,22 @@ end subroutine tScalar_assign__ !-------------------------------------------------------------------------------------------------- !> @brief Type guard, guarantee scalar !-------------------------------------------------------------------------------------------------- -function tNode_asScalar(self) result(scalar) +function tNode_asScalar(self,parent_node) result(scalar) - class(tNode), intent(in), target :: self - class(tScalar), pointer :: scalar + class(tNode), intent(in), target :: self + class(tNode), intent(in), optional :: parent_node + class(tScalar), pointer :: scalar select type(self) class is(tScalar) scalar => self class default - call IO_error(706,ext_msg='Expected "scalar"') + if (present(parent_node)) write(6,'(a)') parent_node%asFormattedString() + if(self%isDict()) then + call IO_error(706,ext_msg='Expected "scalar", found "dict"') + else + call IO_error(706,ext_msg='Expected "scalar", found "list"') + endif end select end function tNode_asScalar @@ -320,16 +326,22 @@ end function tNode_asScalar !-------------------------------------------------------------------------------------------------- !> @brief Type guard, guarantee list !-------------------------------------------------------------------------------------------------- -function tNode_asList(self) result(list) +function tNode_asList(self,parent_node) result(list) - class(tNode), intent(in), target :: self - class(tList), pointer :: list + class(tNode), intent(in), target :: self + class(tNode), intent(in),optional :: parent_node + class(tList), pointer :: list select type(self) class is(tList) list => self class default - call IO_error(706,ext_msg='Expected "list"') + if (present(parent_node)) write(6,'(a)') parent_node%asFormattedString() + if(self%isScalar()) then + call IO_error(706,ext_msg='Expected "list", found "scalar"') + else + call IO_error(706,ext_msg='Expected "list", found "dict"') + endif end select end function tNode_asList @@ -340,14 +352,19 @@ end function tNode_asList !-------------------------------------------------------------------------------------------------- function tNode_asDict(self) result(dict) - class(tNode), intent(in), target :: self - class(tDict), pointer :: dict + class(tNode), intent(in), target :: self + class(tDict), pointer :: dict select type(self) class is(tDict) dict => self class default - call IO_error(706,ext_msg='Expected "dict"') + write(6,'(a)') self%asFormattedString() + if(self%isScalar()) then + call IO_error(706,ext_msg='Expected "dict", found "scalar"') + else + call IO_error(706,ext_msg='Expected "dict", found "list"') + endif end select end function tNode_asDict @@ -444,7 +461,7 @@ function tNode_get_byIndex_asFloat(self,i) result(nodeAsFloat) type(tScalar), pointer :: scalar node => self%get(i) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsFloat = scalar%asFloat() end function tNode_get_byIndex_asFloat @@ -463,7 +480,7 @@ function tNode_get_byIndex_asInt(self,i) result(nodeAsInt) type(tScalar), pointer :: scalar node => self%get(i) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsInt = scalar%asInt() end function tNode_get_byIndex_asInt @@ -482,7 +499,7 @@ function tNode_get_byIndex_asBool(self,i) result(nodeAsBool) type(tScalar), pointer :: scalar node => self%get(i) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsBool = scalar%asBool() end function tNode_get_byIndex_asBool @@ -501,7 +518,7 @@ function tNode_get_byIndex_asString(self,i) result(nodeAsString) type(tScalar), pointer :: scalar node => self%get(i) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsString = scalar%asString() end function tNode_get_byIndex_asString @@ -520,7 +537,7 @@ function tNode_get_byIndex_asFloats(self,i) result(nodeAsFloats) class(tList), pointer :: list node => self%get(i) - list => node%asList() + list => node%asList(self) nodeAsFloats = list%asFloats() end function tNode_get_byIndex_asFloats @@ -539,7 +556,7 @@ function tNode_get_byIndex_asInts(self,i) result(nodeAsInts) class(tList), pointer :: list node => self%get(i) - list => node%asList() + list => node%asList(self) nodeAsInts = list%asInts() end function tNode_get_byIndex_asInts @@ -558,7 +575,7 @@ function tNode_get_byIndex_asBools(self,i) result(nodeAsBools) class(tList), pointer :: list node => self%get(i) - list => node%asList() + list => node%asList(self) nodeAsBools = list%asBools() end function tNode_get_byIndex_asBools @@ -577,7 +594,7 @@ function tNode_get_byIndex_asStrings(self,i) result(nodeAsStrings) type(tList), pointer :: list node => self%get(i) - list => node%asList() + list => node%asList(self) nodeAsStrings = list%asStrings() end function tNode_get_byIndex_asStrings @@ -699,10 +716,11 @@ function tNode_get_byKey_asFloat(self,k,defaultVal) result(nodeAsFloat) class(tNode), pointer :: node type(tScalar), pointer :: scalar + character(len=:), allocatable :: str if(self%contains(k)) then node => self%get(k) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsFloat = scalar%asFloat() elseif(present(defaultVal)) then nodeAsFloat = defaultVal @@ -728,7 +746,7 @@ function tNode_get_byKey_asInt(self,k,defaultVal) result(nodeAsInt) if(self%contains(k)) then node => self%get(k) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsInt = scalar%asInt() elseif(present(defaultVal)) then nodeAsInt = defaultVal @@ -754,7 +772,7 @@ function tNode_get_byKey_asBool(self,k,defaultVal) result(nodeAsBool) if(self%contains(k)) then node => self%get(k) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsBool = scalar%asBool() elseif(present(defaultVal)) then nodeAsBool = defaultVal @@ -780,7 +798,7 @@ function tNode_get_byKey_asString(self,k,defaultVal) result(nodeAsString) if(self%contains(k)) then node => self%get(k) - scalar => node%asScalar() + scalar => node%asScalar(self) nodeAsString = scalar%asString() elseif(present(defaultVal)) then nodeAsString = defaultVal @@ -808,7 +826,7 @@ function tNode_get_byKey_asFloats(self,k,defaultVal,requiredSize) result(nodeAsF if(self%contains(k)) then node => self%get(k) - list => node%asList() + list => node%asList(self) nodeAsFloats = list%asFloats() elseif(present(defaultVal)) then nodeAsFloats = defaultVal @@ -839,7 +857,7 @@ function tNode_get_byKey_asInts(self,k,defaultVal,requiredSize) result(nodeAsInt if(self%contains(k)) then node => self%get(k) - list => node%asList() + list => node%asList(self) nodeAsInts = list%asInts() elseif(present(defaultVal)) then nodeAsInts = defaultVal @@ -869,7 +887,7 @@ function tNode_get_byKey_asBools(self,k,defaultVal) result(nodeAsBools) if(self%contains(k)) then node => self%get(k) - list => node%asList() + list => node%asList(self) nodeAsBools = list%asBools() elseif(present(defaultVal)) then nodeAsBools = defaultVal @@ -895,7 +913,7 @@ function tNode_get_byKey_asStrings(self,k,defaultVal) result(nodeAsStrings) if(self%contains(k)) then node => self%get(k) - list => node%asList() + list => node%asList(self) nodeAsStrings = list%asStrings() elseif(present(defaultVal)) then nodeAsStrings = defaultVal From c0620037a166c3bfbf4428a58063cdc43bbab6e7 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Sat, 27 Feb 2021 13:14:53 -0500 Subject: [PATCH 2/3] simplified tNode_get_byKey_asIndex and tNode_getKey_byIndex; syntax polishing --- src/YAML_types.f90 | 74 ++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/src/YAML_types.f90 b/src/YAML_types.f90 index 92e2a41ba..342440b34 100644 --- a/src/YAML_types.f90 +++ b/src/YAML_types.f90 @@ -72,7 +72,7 @@ module YAML_types getKey => tNode_getKey_byIndex procedure :: & contains => tNode_contains - + generic :: & get => tNode_get_byIndex, & tNode_get_byKey @@ -157,7 +157,7 @@ module YAML_types emptyDict type(tList), target, public :: & emptyList - + abstract interface recursive function asFormattedString(self,indent) @@ -179,7 +179,7 @@ module YAML_types public :: & YAML_types_init, & - output_asStrings, & !ToDo: Hack for GNU. Remove later + output_asStrings, & !ToDo: Hack for GNU. Remove later assignment(=) contains @@ -435,13 +435,12 @@ function tNode_get_byIndex(self,i) result(node) integer :: j self_ => self%asList() + item => self_%first + if(i < 1 .or. i > self_%length) call IO_error(150,ext_msg='tNode_get_byIndex') - j = 1 - item => self_%first - do while(j item%next - j = j + 1 enddo node => item%node @@ -615,14 +614,10 @@ function tNode_getKey_byIndex(self,i) result(key) dict => self%asDict() item => dict%first - do j = 1, dict%length - if(j == i) then - key = item%key - exit - else - item => item%next - endif + do j = 1, min(i,dict%length)-1 + item => item%next enddo + key = item%key end function tNode_getKey_byIndex @@ -630,7 +625,7 @@ end function tNode_getKey_byIndex !------------------------------------------------------------------------------------------------- !> @brief Checks if a given key/item is present in the dict/list !------------------------------------------------------------------------------------------------- -function tNode_contains(self,k) result(exists) +function tNode_contains(self,k) result(exists) class(tNode), intent(in), target :: self character(len=*), intent(in) :: k @@ -641,18 +636,18 @@ function tNode_contains(self,k) result(exists) type(tDict), pointer :: dict exists = .false. - if(self%isDict()) then + if (self%isDict()) then dict => self%asDict() do j=1, dict%length - if(dict%getKey(j) == k) then + if (dict%getKey(j) == k) then exists = .true. return endif enddo - elseif(self%isList()) then + elseif (self%isList()) then list => self%asList() - do j =1, list%length - if(list%get_asString(j) == k) then + do j=1, list%length + if (list%get_asString(j) == k) then exists = .true. return endif @@ -681,7 +676,7 @@ function tNode_get_byKey(self,k,defaultVal) result(node) found = present(defaultVal) if(found) node => defaultVal - + self_ => self%asDict() j = 1 @@ -694,7 +689,7 @@ function tNode_get_byKey(self,k,defaultVal) result(node) item => item%next j = j + 1 enddo - + if (.not. found) then call IO_error(143,ext_msg=k) else @@ -911,11 +906,11 @@ function tNode_get_byKey_asStrings(self,k,defaultVal) result(nodeAsStrings) class(tNode), pointer :: node type(tList), pointer :: list - if(self%contains(k)) then + if (self%contains(k)) then node => self%get(k) list => node%asList(self) nodeAsStrings = list%asStrings() - elseif(present(defaultVal)) then + elseif (present(defaultVal)) then nodeAsStrings = defaultVal else call IO_error(143,ext_msg=k) @@ -943,7 +938,7 @@ function output_asStrings(self) result(output) !ToDo: SR: Rem end function output_asStrings - + !-------------------------------------------------------------------------------------------------- !> @brief Returns the index of a key in a dictionary @@ -954,25 +949,20 @@ function tNode_get_byKey_asIndex(self,key) result(keyIndex) character(len=*), intent(in) :: key integer :: keyIndex - integer :: i type(tDict), pointer :: dict type(tItem), pointer :: item dict => self%asDict() item => dict%first - keyIndex = -1 - do i = 1, dict%length - if(key == item%key) then - keyIndex = i - exit - else - item => item%next - endif + keyIndex = 1 + do while (associated(item%next) .and. item%key /= key) + item => item%next + keyIndex = keyIndex+1 enddo - if(keyIndex == -1) call IO_error(140,ext_msg=key) + if (item%key /= key) call IO_error(140,ext_msg=key) + - end function tNode_get_byKey_asIndex @@ -1003,7 +993,7 @@ recursive function tList_asFormattedString(self,indent) result(str) integer :: i, indent_ str = '' - if(present(indent)) then + if (present(indent)) then indent_ = indent else indent_ = 0 @@ -1011,7 +1001,7 @@ recursive function tList_asFormattedString(self,indent) result(str) item => self%first do i = 1, self%length - if(i /= 1) str = str//repeat(' ',indent_) + if (i /= 1) str = str//repeat(' ',indent_) str = str//'- '//item%node%asFormattedString(indent_+2) item => item%next end do @@ -1032,7 +1022,7 @@ recursive function tDict_asFormattedString(self,indent) result(str) integer :: i, indent_ str = '' - if(present(indent)) then + if (present(indent)) then indent_ = indent else indent_ = 0 @@ -1040,7 +1030,7 @@ recursive function tDict_asFormattedString(self,indent) result(str) item => self%first do i = 1, self%length - if(i /= 1) str = str//repeat(' ',indent_) + if (i /= 1) str = str//repeat(' ',indent_) select type(node_1 =>item%node) class is(tScalar) str = str//trim(item%key)//': '//item%node%asFormattedString(indent_+len_trim(item%key)+2) @@ -1254,7 +1244,7 @@ subroutine tDict_set(self,key,node) if (item%key == key) exit item => item%next end do searchExisting - if (.not. item%key == key) then + if (item%key /= key) then allocate(item%next) item => item%next self%length = self%length + 1 @@ -1288,7 +1278,7 @@ recursive subroutine tItem_finalize(self) type(tItem),intent(inout) :: self deallocate(self%node) - if(associated(self%next)) deallocate(self%next) + if (associated(self%next)) deallocate(self%next) end subroutine tItem_finalize From fd24c9c2a193972ea17e94ba848d87d2aeb43028 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Sat, 27 Feb 2021 13:22:46 -0500 Subject: [PATCH 3/3] simplified tNode_get_byKey_asIndex and tNode_getKey_byIndex==>get_byIndex_asKey; syntax polishing --- src/YAML_types.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/YAML_types.f90 b/src/YAML_types.f90 index 342440b34..7a741a5c8 100644 --- a/src/YAML_types.f90 +++ b/src/YAML_types.f90 @@ -67,9 +67,9 @@ module YAML_types procedure :: & tNode_get_byKey_asStrings => tNode_get_byKey_asStrings procedure :: & - getIndex => tNode_get_byKey_asIndex + getKey => tNode_get_byIndex_asKey procedure :: & - getKey => tNode_getKey_byIndex + getIndex => tNode_get_byKey_asIndex procedure :: & contains => tNode_contains @@ -602,7 +602,7 @@ end function tNode_get_byIndex_asStrings !-------------------------------------------------------------------------------------------------- !> @brief Returns the key in a dictionary as a string !-------------------------------------------------------------------------------------------------- -function tNode_getKey_byIndex(self,i) result(key) +function tNode_get_byIndex_asKey(self,i) result(key) class(tNode), intent(in), target :: self integer, intent(in) :: i @@ -619,7 +619,7 @@ function tNode_getKey_byIndex(self,i) result(key) enddo key = item%key -end function tNode_getKey_byIndex +end function tNode_get_byIndex_asKey !-------------------------------------------------------------------------------------------------